在 v-for 的情况下如何从 v-model 输入更新 Vuex 存储

How to update Vuex store from v-model input in case of v-for

我说数组中有 10 个对象 policies = [{name:'a',text:''},{name:'b',text:''},....]

它们使用 v-for 进行迭代以显示标签 A:带有文本 属性 绑定为 v-model 的输入框。 我想在 v-model 中的策略文本发生变化时触发突变。

这里是 fiddle link。 https://jsfiddle.net/dmf2crzL/41/

我们假设您希望将 v-model 用于 2-way 绑定以及 Vuex 存储。

你的问题是你想在严格模式下存储 Vuex。

const store = new Vuex.Store({
  // ...
  strict: true
})

所以你所有的变异都应该通过 Vuex 存储,你可以在 Vue.js devtools 中看到它。

方法一:我们可以通过克隆对象避免Vuex报错,使用watcher提交mutation

const store = new Vuex.Store({
  strict: true,
  state: {
    formdata: [
      { label: 'A', text: 'some text' },
      { label: 'B', text: 'some other text' },
      { label: 'C', text: ' this is a text' }
    ]
  },
  mutations: {
    updateForm: function (state, form) {
      var index = state.formdata.findIndex(d=> d.label === form.label);
      Object.assign(state.formdata[index], form);
    }
  }
});
    
new Vue({
  el: '#app',
  store: store,
  data () {
    return {
      //deep clone object
      formdata: JSON.parse(JSON.stringify(this.$store.state.formdata))
    };
  },
  computed: {
    formdata() {
      return this.$store.state.formdata
    }
  },
  watch: {
    formdata: function(form)
      this.$store.commit('updateForm', form);
    }
  }
})

方法 2:您可以使用计算 get/set 根据 vuex doc

提交您的变更
computed: {
  message: {
    get () {
      return this.$store.state.obj.message
    },
    set (value) {
      this.$store.commit('updateMessage', value)
    }
  }
}

我的库 vuex-dot 简化了 vuex 存储上的反应性(当然还有 v-model)使用

https://github.com/yarsky-tgz/vuex-dot

<template>
  <form>
    <input v-model="name"/>
    <input v-model="email"/>
  </form>
</template>

<script>
  import { takeState } from 'vuex-dot';

  export default {
    computed: {
      ...takeState('user')
        .expose(['name', 'email'])
        .dispatch('editUser')
        .map()
    }
  }
</script>

另一种我觉得有用的方法:

  1. 将 v-model 替换为 (v-on) 函数
  2. 该函数触发突变
  3. 突变("function" 在商店中)改变状态中的一个值
  4. a getter("computed" 在商店)"listens" 到 属性 值的变化并相应地变化。

这是一个如何使用 Vuex 过滤卡片的示例(而不是 v-model:

触发函数的输入"updateFilter":

    <input type="text" placeholder="filter" v-on:input='updateFilter'>

触发突变(提交)的函数(方法):

  methods: {
updateFilter(event){
  this.$store.commit('updateFilter', event.target.value);
}

在store.js中,改变数据(状态)的突变:

mutations: {
    updateFilter (state, filter) {
        state.filter = filter; 
    },

状态:

state: {filter: ""}

和getter(计算)"listens"到状态的变化。

getters: {
    filteredGames: state => {
        //your filter code here
          return filtered;
        })
    }, 

最后,需要过滤的组件有这个计算 (getter):

  computed: {
filtered() {
  return this.$store.getters.filteredGames;
}