在VueJS中观察存储在Vuex中的数组

时间:2016-08-10 13:38:49

标签: javascript arrays vue.js vuex

我有一个客户列表,实际上是一个对象数组。我把它存放在Vuex中。我在我的组件中呈现列表,每行都有一个复选框。更确切地说,我使用keen-ui和复选框渲染部分看起来像:

<tr v-for="customer in customers" :class="{ selected: customer.selected }">
    <td>
      <ui-checkbox :value.sync="customer.selected"></ui-checkbox>
    </td>
    <td>{{ customer.name }}</td>
    <td>{{ customer.email }}</td>
</tr>

因此,复选框直接更改了客户数组,这是不好的:我在Vuex中使用严格模式,它会抛出一个错误。

我想跟踪数组何时更改并调用操作以更改vuex状态:

watch: {
 'customers': {
  handler() {
    // ...
  },

  deep: true
}

然而,它仍然直接改变了客户。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

首先,使用.sync时要小心:它将在2.0中弃用。

看看这个:http://vuex.vuejs.org/en/forms.html,因为这个问题在这里解决了。基本上,此复选框应在vuexinput上触发change操作。取自文档:

<input :value="message" @input="updateMessage">

updateMessage的位置:

vuex: {
  getters: {
    message: state => state.obj.message
  },
  actions: {
    updateMessage: ({ dispatch }, e) => {
      dispatch('UPDATE_MESSAGE', e.target.value)
    }
  }
}

如果您不想跟踪突变,可以将此组件的状态从vuex移开,以便能够在其所有荣耀中使用v-model

答案 1 :(得分:0)

你只需要制作一个自定义的getter和setter:

<template>
    <ui-checkbox :value.sync="thisCustomer"></ui-checkbox>
</template>

<script>
    //this is using vuex 2.0 syntax
    export default {
        thisCustomer: {
            get() {
                return this.$store.state.customer;
            },
            set(val) {
                this.$store.commit('SET_CUSTOMER', val);
                // instead of performing the mutation here,
                 // you could also use an action:
                  // this.$store.disptach('updateCustomer')
            }
       },
   }
</script>

在您的商店中:

import {
    SET_CUSTOMER,
} from '../mutation-types';

const state = {
    customer: null,
};

const mutations = {
    [SET_CUSTOMER](state, value) {
        state.customer = value;
    },
}

我不完全确定你的商店是什么样的,但希望这会给你一个想法:)