# 双向绑定和 vuex 是否冲突

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

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

在严格模式中使用 Vuex,当用户输入时,v-model 会试图直接修改属性值,但这个修改不是在 mutation 中修改的,所以会抛出一个错误。当需要在组件中使用 vuex 中的 state 时,有 2 种解决方案

1.绑定 value,监听 Input 事件

<input :value="message" @input="updateMessage" />
1
// ...
computed: {
  ...mapState({
    message: state => state.obj.message
  })
},
methods: {
  updateMessage (e) {
    this.$store.commit('updateMessage', e.target.value)
  }
}
1
2
3
4
5
6
7
8
9
10
11

下面是 mutation 函数:

// ...
mutations: {
  updateMessage (state, message) {
    state.obj.message = message
  }
}
1
2
3
4
5
6

2.双向绑定的计算属性

<input v-model="message" />
1
// ...
computed: {
  message: {
    get () {
      return this.$store.state.obj.message
    },
    set (value) {
      this.$store.commit('updateMessage', value)
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11