不用commit提交就能修改mapState的值【使用this.$set】

情景:商城的購物車界面,點擊全選選中全部商品,再次點擊全部取消。商城裏的數據存儲在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]);
                }
            },
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章