【发布时间】:2018-07-26 03:21:18
【问题描述】:
我在使用 Vuex 绑定复选框时遇到问题。在复选框上,我使用带有 getter 和 setter 的变量的 v-model 来设置或获取存储中的值,问题是我在存储中得到错误的数据,我不明白是什么导致了问题。复选框绑定到存储属性,并且该属性必须包含来自复选框的 id 数组,但是当我多次单击复选框时,它会重写或删除存储值。谁能帮我理解为什么会发生这种情况? Link 到 jsFiddle。
代码
const store = new Vuex.Store({
state: {
checkboxes: {},
checked: {}
},
mutations: {
setCheckboxes(state, dataObj){
console.log(dataObj);
state.checkboxes = dataObj.data;
let firstElem = dataObj.data[Object.keys(dataObj.data)[0]];
state.checked[firstElem.parent_id] = [firstElem.id];
console.log(state.checked);
},
setTreeState(state, dataObj){
state.checked[dataObj.id] = dataObj.value;
console.log(state.checked);
}
}
});
Vue.component('checkboxTree', {
template: "#checkboxTree",
});
Vue.component('checkboxToggle', {
template: "#checkboxToggle",
data(){
return {
store
}
},
computed: {
value:{
get(){
return store.state.checked[this.checkbox.parent_id];
},
set(val){
store.commit({
type: 'setTreeState',
id: this.checkbox.parent_id,
value: val
});
},
},
},
props: ['checkbox']
});
const app = new Vue({
el: "#app",
store,
data: {
checkboxData: {
...
},
},
mounted(){
this.$store.commit({
type: 'setCheckboxes',
data: this.checkboxData
});
}
})
模板
<div id="app">
<checkbox-tree :checkboxData="checkboxData"></checkbox-tree>
</div>
<template id="checkboxTree">
<div>
<p>checkbox tree</p>
<form>
<ul>
<li v-for="checkbox in $store.state.checkboxes">
<checkbox-toggle :checkbox="checkbox"></checkbox-toggle>
</li>
</ul>
</form>
</div>
</template>
<template id="checkboxToggle">
<div>
<label>{{ checkbox.id }}</label>
<input type="checkbox"
:value="checkbox.id"
:id="'checkbox-' + checkbox.id"
:name="'checkbox-' + checkbox.id"
v-model="value"
>
</div>
</template>
【问题讨论】:
-
请描述您希望如何组织该州。目前还不清楚
checked: {}对象究竟应该是什么样子。它应该包含ID吗?那么为什么它不是一个对象而不是一个数组呢?当您指定这些内容时,会更容易为您提供帮助。
标签: javascript checkbox vue.js vuex