将v-model的值绑定到vuex中时遇到的问题及解决办法(computed替代watch)

store.js如下:

复制代码
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    value: 100
  },
  mutations: {
    updateValue(state, value) {
      state.value = value
    }
  }
})
复制代码

组件中使用vuex中的value:

    <el-input v-model="myValue"></el-input>
    <p>{{value}}</p>
复制代码
import { mapState, mapMutations } from 'vuex'
export default {
  data() {
    return {
      myValue: 0
    }
  },
  computed: {
    ...mapState({
      value: (state) => state.value
    })
  },
  watch: {
    myValue(newVal) {
      this.updateValue(newVal)
    }
  },
  methods: {
    ...mapMutations({
      updateValue: 'updateValue'
    })
  },
  created() {
    const { value } = this
    this.myValue = value
  }
}
复制代码

思路:将vuex中的value映射到组件的myValue中,页面渲染myValue。v-model修改myValue时通过watch监听去改变vuex中的value

 

其实是可以有简便方法去双向绑定value的

思路:通过使用computed的get和set方法去获取和改变vuex中的value

    <el-input v-model="value"></el-input>
    <p>{{value}}</p>
  computed: {
    value() {
      return this.$store.state.value
    }
  }

页面效果:

但是此时在输入框内输入或删除字符,就会报错:

原因是通过v-model设置value的值,就是要触发computed,但此时value值只设置了get而没有设置set,解决:

复制代码
  computed: {
    value: {
      get(){
        return this.$store.state.value
      },
      set(value) {
        this.$store.commit('updateValue', value)
      }
    }
  }
复制代码

这样,就可以实现将数据双向绑定到vuex中了。

 

posted @   吴小明-  阅读(923)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示