【问题标题】:Vuex getter not updating value after an array updateVuex getter在数组更新后不更新值
【发布时间】:2017-08-28 00:48:50
【问题描述】:

我正在尝试探索 vuex,所以我想要做的是在我删除或添加值时获取计数或数组。以下是我的代码。

home.vue 模板

<template>
    <div :class="page.class" :id="page.id">
        <h3>{{ content }}</h3>
        <hr>
        <p>Registered users count {{ unRegisteredUserCount }}</p>
        <ul class="list-unstyled" v-if="getUnRegisteredUsers">
            <li v-for="(unregistereduser, n) in getUnRegisteredUsers" @click="register(unregistereduser)">
                {{ n + 1 }}
                - {{ unregistereduser.id }} 
                {{ unregistereduser.fname }} 
                {{ unregistereduser.lname }}
            </li>
        </ul>
        <hr>
        <p>Registered users count {{ registeredUserCount }}</p>
        <ul class="list-unstyled">
            <li v-for="(registereduser, n) in getRegisteredUsers" @click="unregister(registereduser)">
                {{ n + 1 }}
                - {{ registereduser.id }} 
                {{ registereduser.fname }} 
                {{ registereduser.lname }}
            </li>
        </ul>
    </div>
</template>

<script>
    export default {
        name: 'home',
        data () {
            return {
                page: {
                    class: 'home',
                    id: 'home'
                },
                content: 'This is home page'
            }
        },
        computed: {
            getUnRegisteredUsers() {
                if( this.$store.getters.getCountUnregisteredUsers ) {
                    return this.$store.getters.getAllUnRegisteredUsers;
                }
            },
            getRegisteredUsers() {
                if( this.$store.getters.getCountRegisteredUsers > 0) {
                    return this.$store.getters.getAllRegisteredUsers;
                }
            },
            unRegisteredUserCount() {
                return  this.$store.getters.getCountUnregisteredUsers;
            },
            registeredUserCount() {
                return  this.$store.getters.getCountRegisteredUsers;
            }
        },
        methods: {
            register(unregistereduser) {
                this.$store.commit({
                    type: 'registerUser', 
                    userId: unregistereduser.id
                });
            },
            unregister(registereduser) {
                this.$store.commit({
                    type: 'unRegisterUser', 
                    userId: registereduser.id
                });
            }
        },
        mounted: function() {

        }
    }
</script>

state.js

export default {
    unRegisteredUsers: [
        {
            id: 1001,
            fname: 'John',
            lname: 'Doe',
            state: 'Los Angeles',
            registered: false
        },
        {
            id: 2001,
            fname: 'Miggs',
            lname: 'Ollesen',
            state: 'Oklahoma',
            registered: false
        },
        {
            id: 3001,
            fname: 'Zoe',
            lname: 'Mcaddo',
            state: 'New York',
            registered: false
        },
        {
            id: 4001,
            fname: 'Jane',
            lname: 'Roberts',
            state: 'Philadelphia',
            registered: false
        },
        {
            id: 5001,
            fname: 'Ellen',
            lname: 'Jennings',
            state: 'Houston',
            registered: false
        },
        {
            id: 6001,
            fname: 'Joseph',
            lname: 'Reed',
            state: 'Boston',
            registered: false
        },
        {
            id: 7001,
            fname: 'Jake',
            lname: 'Doe',
            state: 'Portland',
            registered: false
        }
    ],
    registeredUsers: []
}

getters.js

export default {
    getAllUnRegisteredUsers(state) {
        return state.unRegisteredUsers;
    },
    getAllRegisteredUsers(state) {
        return state.registeredUsers;
    },
    getCountUnregisteredUsers(state) {
        return state.unRegisteredUsers.length;
    },
    getCountRegisteredUsers(state) {
        return state.registeredUsers.length;
    },
    getUserById(state) {

    }
}

mutations.js

export default {
    registerUser(state, payload) {
        //find user
        const user = _.find(state.unRegisteredUsers, {
            'id': payload.userId
        });

        // remove user from original array
        _.remove(state.unRegisteredUsers, {
            'id': payload.userId
        });

        // set user object key value
        user.registered = 'true';

        // add user to new array
        state.registeredUsers.push(user);

        console.log(state.registeredUsers.length + ' - registered users count');
    },
    unRegisterUser(state, payload) {
        //find user
        const user = _.find(state.registeredUsers, {
            'id': payload.userId
        });

        // remove user from original array
        _.remove(state.registeredUsers, {
            'id': payload.userId
        });

        // set user object key value
        user.registered = 'false';

        // add user to new array
        state.unRegisteredUsers.push(user);

        console.log(state.unRegisteredUsers.length + ' - unregistered users count');
    }
}

在页面加载期间,它会正确呈现数组计数,但是当我删除 registeredUsers 和 unRegisteredUsers 的值时,计数不会更新。我在这里想念什么?谁能解释一下,我应该怎么做才能得到正确的计数?谢谢

【问题讨论】:

    标签: javascript arrays vue.js vuejs2 vuex


    【解决方案1】:

    这不起作用的原因是你正在改变一个数组。永远不要改变数组。您将花费数小时尝试排除反应性中断的原因。

    用新数组替换一个值以保持反应性。使用 _.filter 或 _.reject,如下例所示。

    state.registeredUsers = _.reject(state.registeredUsers, {
        'id': payload.userId
    });
    

    choasia 的另一个答案是不正确的。洛达什不是问题。 Lodash 对 Vuejs 非常有帮助,您只需要使用显式返回新数组的函数即可。请参阅“返回”下的 Lodash 文档以了解它返回的内容。

    【讨论】:

      【解决方案2】:

      要添加到名称的 cmets 以从数组中删除内容,请在更新//添加到数组时使用 Vue.set。

      updateItem(state, payload) {
          Vue.set(state.items, payload.index, payload.data);
      }
      

      在此处查看文档:https://vuex.vuejs.org/guide/mutations.html#mutations-follow-vue-s-reactivity-rules

      【讨论】:

        【解决方案3】:

        由于 JavaScript 的限制,在 vuejs(以及 vuex)中修改列表或对象是 tricky。
        您似乎正在使用 lodash 删除数组中的项目。它会与 vuejs 的响应性发生冲突。 See issue here.
        如果要删除数组中的项目,最好使用splice 来执行此操作。

        【讨论】:

          猜你喜欢
          • 2017-12-24
          • 2017-04-13
          • 2020-05-07
          • 2019-08-06
          • 2017-12-07
          • 2019-05-15
          • 2021-01-18
          • 2019-02-18
          • 2016-12-13
          相关资源
          最近更新 更多