Vuex状态数组对象的计算属性

cor*_*ory 5 vue.js vuex vuejs2

这个问题通常也适用于Vue,但是我在项目中使用Vuex。

我的商店中有一个对象数组,我想为其提供一个已计算的属性。

为了简化,假设我的商店如下:

const state = {
    numbers = [
        {num: 2, multiplier: 3},
        {num: 5, multiplier: 10},
        {num: 1, multiplier: 6}
    ]
};
Run Code Online (Sandbox Code Playgroud)

现在,我想要一个数字数组每个对象的计算属性,以便结果为num *乘数(例如2 * 3 = 6、5 * 10 = 50)

一种解决方案是使计算所得的属性返回数字数组,再加上计算所得的字段...例如:

const getterrs = {
    num_list(state){
        const list = state.numbers
        list.map(n=>{
            n.value=n.num*n.multiplier;
        );
        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

可以,但是有两个问题:

  • 返回的数组不能与非计算字段上的v-model绑定

  • 每当数组中的任何元素发生更改时,整个数组都会被重新计算...我只想重新计算发生更改的单个元素。

Vue / Vuex有可能吗?

And*_*325 0

您可以在正在使用的组件中对存储数据进行任何计算。我会让您的 getter 只需返回数字数组:

const getters = {
    num_list(state){
        return state.numbers;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的组件中,您可以使用 getter 访问数字并按照您想要的方式使用它。因此,如果你想显示原始数组,你可以这样得到它:

computed: {
        num_list() {
            return this.$store.getters.num_list
        }
    }
Run Code Online (Sandbox Code Playgroud)

并将其显示在您的模板中,如下所示:

<p>Our first number is {{num_list[0].num}} and it's multiplier is {{num_list[0].num}}</p>
Run Code Online (Sandbox Code Playgroud)

如果你还想计算乘法,你可以有另一个计算属性:

multiplied() {
    return this.num_list[0].num*this.num_list[0].multiplier
}
Run Code Online (Sandbox Code Playgroud)

并在模板中用 回显它{{multiplied}}

现在,如果您的组件中有一个可以用作索引的数据元素,或者如果您有一个方法而不是计算属性,那么您可以传递一个参数,这将使事情变得更加灵活。(据我了解,您不应该将参数传递给计算属性)。所以你的乘法方法是这样的:

multipliedMethod(index) {
    return this.num_list[index].num*this.num_list[index].multiplier
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想显示所有结果,您可以使用 v-for 迭代 num_list 并即时进行任何计算:

<div v-for="(num, index) in num_list" :key="index">
  <p>{{num.num*num.multiplier}}</p>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这对于单个组件来说效果很好,但 Vuex 的好处之一是跨多个组件管理全局状态。您必须在需要使用该计算属性的每个组件中实现该计算属性。我希望找到某种不违反 DRY 原则的解决方案:) (2认同)