vuex报错Computed property “xxx“ was assigned to but it has no setter.

当使用vuex存储数据时,常常有这样的需求:输入框显示并动态修改state中的数据。

我们第一个反应就是使用v-model直接绑定state中的数据,虽然确实可以显示和修改,但是控制台会报错,所以不能采取这种方式。

案例如下:

在使用vant组件库实现底部标签栏时,此标签栏在各个页面中都需要显示,故放在App.vue中。

<template>
  <div id="app">
    <router-view></router-view>
    <van-tabbar class="tab" v-model="activeTab" @change="changeActiveTab">
      <van-tabbar-item icon="home-o" to="/home">首页</van-tabbar-item>
      <van-tabbar-item icon="apps-o" to="/cate">分类</van-tabbar-item>
      <van-tabbar-item icon="cart-o" to="/cart" :badge="badgeCount">购物车</van-tabbar-item>
      <van-tabbar-item icon="user-circle-o" to="my">我的</van-tabbar-item>
    </van-tabbar>
  </div>
</template>

<script>
import { mapState, mapGetters, mapMutations } from 'vuex'

export default {
  data () {
    return {}
  },
  computed: {
    ...mapState('m_user', ['activeTab']),
    // ...
  },
  methods: {
    ...mapMutations('m_user', ['updateActiveTab']),
    changeActiveTab (index) {
      this.updateActiveTab(index)
    }
  }
}
</script>

activeTab:绑定选中标签的索引值,通过修改 v-model 即可切换选中的标签。

由于多个页面都可以切换标签,把activeTab作为公共变量存储到vuex中。updateActiveTab公共方法用于修改activeTab的值。

上面的代码可以切换标签,但是会报错:Computed property "activeTab" was assigned to but it has no setter.

解决办法:通过计算属性getter获取vuex中的值,通过setter来修改值。

这里新增一个计算属性active作为绑定值,利用getter和setter 来调用和修改公共变量activeTab。

<template>
  <div id="app">
    <router-view></router-view>
    <van-tabbar class="tab" v-model="active">
      <van-tabbar-item icon="home-o" to="/home">首页</van-tabbar-item>
      <van-tabbar-item icon="apps-o" to="/cate">分类</van-tabbar-item>
      <van-tabbar-item icon="cart-o" to="/cart" :badge="badgeCount">购物车</van-tabbar-item>
      <van-tabbar-item icon="user-circle-o" to="my">我的</van-tabbar-item>
    </van-tabbar>
  </div>
</template>
<script>
import { mapState, mapGetters, mapMutations } from 'vuex'

export default {
  data () {
    return {}
  },
  computed: {
    ...mapState('m_user', ['activeTab']),
    // ...
    active: {
      get () { return this.activeTab },
      set (val) { this.changeActiveTab(val) }
    }
  },
  methods: {
    ...mapMutations('m_user', ['updateActiveTab']),
    changeActiveTab (index) {
      this.updateActiveTab(index)
    }
  }
}
</script>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值