代码之家  ›  专栏  ›  技术社区  ›  dib258

如何管理Vuex Store中的嵌套阵列并通过组件传递

  •  3
  • dib258  · 技术社区  · 7 年前

    在我的Vuex商店中,我有一个计划状态,它描述了一周的计划。

    planning : [
            {
                name : 'monday',
                meetings : [
                    {
                        name : 'morning',
                        value : ''
                    }, {
                        name : 'noon',
                        value : ''
                    }, {
                        name : 'evening',
                        value : ''
                    }]
            },
            {
                name : 'tuesday',
                meetings : [
                    {
                        name : 'morning',
                        value : ''
                    }, {
                        name : 'noon',
                        value : ''
                    }, {
                        name : 'evening',
                        value : ''
                    }]
            },
    
            ...
    
        }
    ]
    

    来展示我所有的东西

    计划周。vue

    <template>
        <div class="week columns is-desktop is-vcentered">
            <PlanningDay v-for="(day, index) in planning" :key="index" :day="day"></PlanningDay>
        </div>
    </template>
    
    <script>
        import PlanningDay from './PlanningDay';
        import { mapState } from 'vuex';
    
        export default {
            computed : mapState(['planning']),
            components : {
                PlanningDay
            },
        };
    </script>
    

    我每天都有计划日。vue从他的道具中检索当天,然后进行渲染,但这是Vuex的方式吗。因为通常我们必须从Vuex存储中获取/设置(提交)。

    我继续使用嵌套代码,以便您可以看到所有内容

    计划日。vue

    <template>
        <div class="day column">
            <p class="name has-text-centered" v-text="day.name"></p>
    
            <PlanningMeeting v-for="(meeting, index) in day.meetings" :key="index" :meeting="meeting"></PlanningMeeting>
        </div>
    </template>
    
    <script>
        import PlanningMeeting from './PlanningMeeting';
    
        export default {
            props : ['day'],
            components : {
                PlanningMeeting
            }
        };
    </script>
    

    最后是计划会议。vue

    <template>
        <div class="meeting">
            <p class="has-text-centered" v-text="meeting.name"></p>
            <input type="text" v-model="meeting.value">      
        </div>
    </template>
    

    我怎么能安排会议呢。哪些价值来自PlanningDay的道具,哪些价值来自PlanningWeek?

    由于使用commit进行了修改以更改状态,因此如下所示:

    <script>
        export default {
            props : ['meeting'],
            computed : {
                meetingList : {
                    get() {
                        return this.$store.state.planning[planningId].meetings[meetingId];
                    },
                    set(value) {
                        this.$store.commit('updateValue', ...planningId, meetingId, ... value);
                    }
                }
            },
        };
    </script>
    

    所以我会用meetingList计算的属性或类似的东西来绑定v模型,但是如何以正确的方式检索planningId和meetingId。因为Vuex的要点是不放置事件,并在任何地方放置道具并提取此数据层。

    我做错什么了吗?在Vuex中管理嵌套数组以将数据传递给嵌套组件的最佳方法是什么?

    提前感谢您的回答!

    2 回复  |  直到 7 年前
        1
  •  4
  •   Dhanesh Agrawal    6 年前

    最好的做法是避免嵌套结构。这也是其他全局状态单状态树系统(如redux)中的既定模式。但这里不需要Redux。对数据进行规范化是一个好主意,是的——redux中用于此内容的模式也适用于vuex。

    标准化基本上意味着你转向这个:

    planning : [
        {
            name : 'monday',
            meetings : [
                {
                    name : 'morning',
                    value : ''
                }, {
                    name : 'noon',
                    value : ''
                }, {
                    name : 'evening',
                    value : ''
                }]
        },
        {
            name : 'tuesday',
            meetings : [
                {
                    name : 'morning',
                    value : ''
                }, {
                    name : 'noon',
                    value : ''
                }, {
                    name : 'evening',
                    value : ''
                }]
        },
    
        ...
    
    }
    ]
    

    对此:

    planning: {
      name: [monday,tuesday],
      meetings: {
        monday: { id: 'monday', name: [1,2,3] },
        tuesday: { id: 'tuesday', name: [4,5,6] },
      }
    },
    name : {
       meetings : {
        1: {id: 1, text: 'morning' , value: ''},
        2: {id: 2, text: 'noon' , value: ''},
        3: {id: 3, text: 'evening' , value: ''},        
        4: {id: 4, text: 'morning' , value: ''},
        5: {id: 5, text: 'noon' , value: ''},
        5: {id: 6, text: 'evening' , value: ''},        
        }
    }
    

    planningArray (state) => {
      return state.planning.list.map { 
                name => state.planning.meetings[name]
      }
    }
    

    使用这个你不需要传递道具。对于每一次更改,您都会将数据推送到存储中,并使用“计算/方法”将其检索到另一个组件中

        2
  •  0
  •   Jefry Dewangga    7 年前

    如果我没记错的话,您正试图从vuex状态的输入中保存一个值,即会议。值对象。

    首先,需要将输入绑定到单独的对象中。这样分类:

    data () {
      return {
        value: null
      }
    }
    

    <input type="text" v-model="value">
    <button @click="onValueSaved"></button>
    

    您需要声明一个方法,将值保存到vuex状态,

    methods: {
       onValueSaved () {
         this.$store.commit('SET_MEETING_VALUE', this.value)
       }
    }