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

Posted

技术标签:

【中文标题】如何绑定输入字段并同时更新 vuex 状态【英文标题】:How to bind input field and update vuex state at same time 【发布时间】:2017-11-11 09:31:41 【问题描述】:

我来自 React 背景,从一个 prop 设置你的状态就足够了,你可以调用 setState(...) 来更新状态,所以,使用 vue / vuex,我觉得很难。

为了简化:

Vuex 状态

name: "Foo bar"

Vuex 动作

addName

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

<input @change="addName(newName) v-model="newName" />

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

computed: 
  ...mapState([
  'name'
  ]),
,
beforeMount() 
  // this.newName = this.name
  console.log('Mounted') // Shows in console
  console.log(this.name) // nothing

名称显示在模板&lt;pre&gt; name &lt;/pre&gt;

【问题讨论】:

【参考方案1】:

你可以使用computed setter

computed:
    name:
        get: function() 
            return store.state.name; 
        , 
        set: function(newName) 
            store.dispatch('addName',newName); 
        
    
 
enter code here

并将v-model 设置为&lt;input&gt; 标签中的计算属性name

&lt;input v-model="name" /&gt;

这是工作的jsfiddle

【讨论】:

如果我的表单有 4 或 10 个输入,我必须为每个输入都这样做吗? @HelderLucas 是的。不好玩。我的方法是将它们绑定(v-model)到模板数据中的一个对象,然后将该对象发送到一个命名良好的突变并让突变改变存储。此处建议使用替代技术:ypereirareis.github.io/blog/2017/04/25/… 如果名称在对象中怎么办? @HelderLucas,这篇博文提到了应该处理重复的 vuex-map-fields 库(包括 getter&setter 和突变):markus.oberlehner.net/blog/…

以上是关于如何绑定输入字段并同时更新 vuex 状态的主要内容,如果未能解决你的问题,请参考以下文章

将VueX存储状态值绑定到输入(VueJS)

为啥即使我没有将 vuex 状态绑定到任何 html 输入元素,我的 vuex 状态也会在更改组件级别状态时发生变化?

如何在 Vuex 中通过 POST 请求发送状态数据?

如何在计算的 vuex 中设置状态?

当 vuex 商店的值发生变化时,如何更新组件中的状态?

基于类的 Vue 组件不适用于 v-model 和 vuex