Vuex 语法错误与 localcomputed 函数结合 getter 和 setter

Posted

技术标签:

【中文标题】Vuex 语法错误与 localcomputed 函数结合 getter 和 setter【英文标题】:Vuex syntax error with localcomputed function in combination with getter and setter 【发布时间】:2018-05-07 21:13:05 【问题描述】:

将 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([])

    

如何将这两者结合起来?

【问题讨论】:

【参考方案1】:

您正在尝试在 localComputed 中定义 localMethod

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

因此,您应该能够做到以下几点:

computed: 

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

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

  ...mapState([]),

  ...mapGetters([])


【讨论】:

我正在尝试这个并且仍然收到SyntaxError, Unexpected token mapState(['myStateVar'])。没有 mapstate mixin 它运行。【参考方案2】:

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

// 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-model 绑定应该可以工作了。

【讨论】:

以上是关于Vuex 语法错误与 localcomputed 函数结合 getter 和 setter的主要内容,如果未能解决你的问题,请参考以下文章

使用 Vuex,为啥 mapGetters 不接受与 mapState 相同的语法?

使用 vuex 时如何在 typescript 语法中使用 mapState 函数?

如何将 Vuex mapGetters 与 Vue 3 SFC 脚本设置语法一起使用?

Vue js 使用 Vuex 传播语法

Vuex 突变:使用 ES6 语法解构状态参数(使用 quasar 框架)

vuex (概念几部分组成map高级语法数据持久化)