美文网首页前端100问
【前端100问】Q47:双向绑定和 vuex 是否冲突

【前端100问】Q47:双向绑定和 vuex 是否冲突

作者: alanwhy | 来源:发表于2021-01-12 12:07 被阅读0次

    写在前面

    此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
    为了备战 2021 春招
    每天一题,督促自己
    从多方面多角度总结答案,丰富知识
    双向绑定和 vuex 是否冲突
    简书整合地址:前端 100 问

    正文回答

    vuex 原文解释

    当在严格模式中使用 Vuex 时,在属于 Vuex 的 state 上使用 v-model 会比较棘手:

    <input v-model="obj.message">
    

    假设这里的 obj 是在计算属性中返回的一个属于 Vuex store 的对象,在用户输入时,v-model 会试图直接修改 obj.message。在严格模式中,由于这个修改不是在 mutation 函数中执行的, 这里会抛出一个错误。

    用“Vuex 的思维”去解决这个问题的方法是:给 <input> 中绑定 value,然后侦听 input 或者 change 事件,在事件回调中调用一个方法:

    <input :value="message" @input="updateMessage" />
    
    // ...
    computed: {
      ...mapState({
        message: state => state.obj.message
      })
    },
    methods: {
      updateMessage (e) {
        this.$store.commit('updateMessage', e.target.value)
      }
    }
    
    // ...
    mutations: {
      updateMessage (state, message) {
        state.obj.message = message
      }
    }
    

    必须承认,这样做比简单地使用“v-model + 局部状态”要啰嗦得多,并且也损失了一些 v-model 中很有用的特性。另一个方法是使用带有 setter 的双向绑定计算属性:

    <input v-model="message" />
    
    // ...
    computed: {
      message: {
        get () {
          return this.$store.state.obj.message
        },
        set (value) {
          this.$store.commit('updateMessage', value)
        }
      }
    }
    

    vuex 严格模式

    严格模式

    开启严格模式,仅需在创建 store 的时候传入 strict: true

    const store = new Vuex.Store({
      // ...
      strict: true,
      // strict: process.env.NODE_ENV !== 'production' // 不要在发布环境下启用严格模式!
    });
    

    在严格模式下,无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。

    相关文章

      网友评论

        本文标题:【前端100问】Q47:双向绑定和 vuex 是否冲突

        本文链接:https://www.haomeiwen.com/subject/iqisaktx.html