我有一个客户列表,实际上是一个对象数组。我把它存放在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
}
然而,它仍然直接改变了客户。我该如何解决这个问题?
答案 0 :(得分:0)
首先,使用.sync
时要小心:它将在2.0中弃用。
看看这个:http://vuex.vuejs.org/en/forms.html,因为这个问题在这里解决了。基本上,此复选框应在vuex
或input
上触发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;
},
}
我不完全确定你的商店是什么样的,但希望这会给你一个想法:)