【问题标题】:Mutate vuex state object outside of store在存储之外改变 vuex 状态对象
【发布时间】:2020-10-22 02:19:02
【问题描述】:

假设有这样的商店

...
state: {
    filters: {
        a: '',
        b: ''
    }
},
mutations: {
    updateFilters(state, newObject) {
        state.filters = newObject
    }
}
...

还有这样的组件

...
<input v-model='filters.a'></input>
...
computed: {
    filters: {
        get() {
            this.$store.state.filters
        }
        set(value) {
            this.$store.commit('updateFilters', value)
        }
    }
}
...

一切正常,但我看到一个警告说

错误:“[vuex] 不在突变之外改变 vuex 存储状态 处理程序。”

所以我显然错过了一些东西

我不明白如何处理这个问题。 有人可以解释如何改变组件中的状态对象吗?

我知道,我可以改变每个过滤器道具,但是我在那个对象中有很多过滤器,所以在这种情况下改变每个道具并不是最好的解决方案。

【问题讨论】:

  • 如果你这样做 state.filters ={newObject} 你会得到同样的警告吗?
  • 是 ES6 简写语法
  • 您可以使用具有 2 个参数的通用 mutator - 要变异的对象键(您的过滤器)和要设置的值。

标签: vue.js vuex


【解决方案1】:

问题是你的 setter 永远不会被调用。使用了getter,但是直接更新a

这是一种选择:

<input :value="filters.a" @input="updateFilterA"></input>
...
computed: {
  filters() {
    return this.$store.state.filters /* or mapState */
  }
},
methods: {
  updateFilterA(value) {
    this.$store.commit("updateFilterA", value)
  }
}

在商店里:

mutations: {
  updateFilterA(state, newValue) {
    state.filters.a = newValue
  }
}

【讨论】:

  • 如果您不希望每个过滤器都有特定的突变,请按照 cmets 的@IVOGELOV 建议并更新突变以接受要更新的过滤器和值。
猜你喜欢
  • 2020-03-08
  • 2019-09-24
  • 2019-11-30
  • 2018-02-13
  • 2022-01-09
  • 2020-09-06
  • 1970-01-01
  • 2020-03-30
  • 2023-03-09
相关资源
最近更新 更多