不用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]);
                }
            },

猜你喜欢

转载自blog.csdn.net/qq_41337100/article/details/106063867