如何绑定输入字段并同时更新vuex状态

Syl*_*lar 4 vue.js vuex vuejs2

我来自React背景,它足以从一个道具设置你的状态,你可以调用setState({...})更新状态,所以,使用vue/vuex,我发现它很难.

简化:

Vuex州

name: "Foo bar"

Vuex行动

addName

我可以改变状态没问题,但我需要绑定一个输入字段,当更改时,状态会更新.将此视为一种更新表单,其中用户详细信息已预先填写,并且可以更改其名称.

<input @change="addName(newName) v-model="newName" />
Run Code Online (Sandbox Code Playgroud)

我可以添加一个watch来监视newName和更新状态,但是,我需要预先用状态填充输入.哈!我可以使用,beforeMount()但我的状态尚未加载.

computed: {
  ...mapState([
  'name'
  ]),
},
beforeMount() {
  // this.newName = this.name
  console.log('Mounted') // Shows in console
  console.log(this.name) // nothing
}
Run Code Online (Sandbox Code Playgroud)

名字显示在templete中 <pre>{{ name }}</pre>

Vam*_*hna 13

哟可以使用计算机设定器

computed:{
    name:{
        get: function(){ 
            return store.state.name; 
        }, 
        set: function(newName){ 
            store.dispatch('addName',newName); 
        }
    }
} 
enter code here
Run Code Online (Sandbox Code Playgroud)

并在标记中设置v-model为computed属性:name<input>

<input v-model="name" />

这是工作的jsfiddle

  • @HelderLucas 是的。不好玩。我的方法是将它们绑定(v-model)到模板数据中的一个对象,然后将该对象发送到一个命名很好的突变并让突变改变存储。此处建议使用替代技术:https://ypereirareis.github.io/blog/2017/04/25/vuejs-two-way-data-binding-state-management-vuex-strict-mode/ (2认同)
  • @HelderLucas,这篇博文提到了 vuex-map-fields 库,它应该处理重复(getter&amp;setter 和突变):https://markus.oberlehner.net/blog/form-fields-two-way-data-binding -和-vuex/ (2认同)