情景:商城的购物车界面,点击全选选中全部商品,再次点击全部取消。商城里的数据存储在vuex里面一个叫做list_cart的数组里,其中一个属性是ischecked来控制每个商品是否被选中。
而下面这个则是van-submit-bar里面嵌套了一个van-checkbox,通过v-model="checked"来控制。checked也是一个computed数据:
点击后父组件(购物车页面)传递改变的value值,同时向父组件发消息代表方便改变其他选项的值。
checked: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
}
但是遇到的问题是,因为list是mapState引入的值,是computed的值,不能够直接修改。如果list不是vuex中映射的值,而是后端接口直接发送的数据,那么可以直接对list进行修改如图。
handleAllSelect(value) {
const data = this.list.map(item => {
item.isChecked = value
return item
})
this.list = data
},
按道理一般修改mapState的值应该是通过commit,但是这样就很麻烦。有一个简单的办法,类似于使用computed中的setter,直接修改。可以看出来第一个参数是我要修改的computed变量——this.list,第二个是要修改的参数,第三个是修改好之后的值。这样就能够简单修改了。
记住不是直接使用this.list.set
而是this.$set(this.list)
// 全选
handleAllSelect(value) {
for(let i=0;i<this.list.length;i++){
this.list[i].isChecked = value;
this.$set(this.list, i,this.list[i]);
}
},