表单处理

使用 Vuex 的严格模式时,如果对 Vuex 管理的状态使用 v-model 的话,会有点棘手。

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

假设 obj 是一个计算属性,从 store 返回一个对象,当用户在输入框输入时,这里的 v-model 会试图直接修改 obj.message,这在严格模式下就会报错,因为不是在 mutation 处理器内改变状态。

『Vuex 式』的解决方案是,绑定 <input> 的 value 然后在 inputchange 事件中提交修改:

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

然后这里是 mutation 处理器:

// ...
mutations: {
  updateMessage (state, message) {
    state.obj.message = message
  }
}

双向绑定计算属性

的确,上面的处理方式比起 v-model + 本地状态是繁琐了一点,也失去了一些 v-model 有用的功能。另一种可选的方案是借助 setter,双向绑定计算属性。

// ...
computed: {
  message: {
    get () {
      return this.$store.state.obj.message
    },
    set (value) {
      this.$store.commit('updateMessage', value)
    }
  }
}