情景:商城的購物車界面,點擊全選選中全部商品,再次點擊全部取消。商城裏的數據存儲在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]);
}
},