与getter和setter结合使用本地计算函数的Vuex语法错误

时间:2017-11-23 21:17:43

标签: javascript vue.js vuex

将Vuex本地计算对象与get / set以及存储映射结合使用时出现语法错误。

如Vuex文档中所示,您可以使用对象扩展操作符来映射这样的存储方法:

computed: {
  localComputed () { /* ... */ },
  // mix this into the outer object with the object spread operator
  ...mapState({
    // ...
  })
}

https://vuex.vuejs.org/en/state.html##object-spread-operator

您还可以创建计算机设置器,如:

computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}

https://vuejs.org/v2/guide/computed.html#Computed-Setter

我可以使用get set创建计算对象,也可以使用mapState / mapGetters等创建 - 但不能组合使用。它打破了语法(错误是:函数声明后的预期函数名称)。

    computed: {
        localComputed () {
            localMethod: {
                get: function () {
                        // retrieve
                },
                set: function (newContent) {
                    // set
                }
            }
        }, ...mapState([

                       ]), ...mapGetters([])

    }

我如何将这两者结合起来?

2 个答案:

答案 0 :(得分:5)

您正尝试在 localComputed 中定义 localMethod

在文档中, localComputed 只是组件中计算属性的示例名称。您不必将所有其他本地计算属性放在其中。

因此,您应该能够执行以下操作:

computed: {

  localComputed: {
    get: function () {
      // retrieve
    },
    set: function (newContent) {
      // set
    }
  },

  anotherLocalComputed: {
    get: function () {
      // retrieve
    },
    set: function (newContent) {
      // set
    }
  },

  ...mapState([]),

  ...mapGetters([])

}

答案 1 :(得分:0)

这是工作示例。我已经使用这种方法超过一年了

// in some utils/vuex.js file 
export const mapSetter = (state, setters = {}) => (
  Object.keys(state).reduce((acc, stateName) => {
    acc[stateName] = {
      get: state[stateName],
   };
   // check if setter exists
   if (setters[stateName]) {
      acc[stateName].set = setters[stateName];
   }

   return acc;
 }, {})
);

在您的component.vue文件中

  import { mapSetter  } from 'path/to/utils/vuex.js';
  ...

  export default {
    name: 'ComponentName',
    computed: {
      ...mapSetter(
        mapState({
          result: ({ ITEMS }) => ITEMS.result,
          total: ({ ITEMS }) => ITEMS.total,
          current: ({ ITEMS }) => ITEMS.page,
          limit: ({ ITEMS }) => ITEMS.limit,
        }),
        {
          limit(payload) {
            this.$store.dispatch({ type: TYPES.SET_LIMIT, payload });
          },
        },
      )
    },
  }

现在v模型绑定应该可以了。