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

Posted

技术标签:

【中文标题】使用 vuex 时如何在 typescript 语法中使用 mapState 函数?【英文标题】:How to use mapState function in typescript syntax when using vuex? 【发布时间】:2019-01-03 04:20:00 【问题描述】:

我在与 vuex 集成的 vuejs 项目中使用 typescript 语法。 我想使用在我的 .ts 文件中计算的 mapState 方法,但出现语法错误。 目前我正在使用文档建议的计算函数语法,我的意思是:

 get counter() 
   return  this.$store.state.count;
 

如果您阅读 Vuex 文档,您会发现以这种方式使用 Vuex 而不是使用mapState 是非常重复的。在大型应用程序中使用mapState 非常简单且有用。我想在我的 Typescript 组件中使用mapState,但我不知道正确的方法。我尝试了下面的方法来使用mapState 函数,但没有成功。

get mapState(
  counter:count
);

// or

get mapState(['name', 'age', 'job'])

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

【参考方案1】:

你可以在组件注解中调用 mapState:

import  Component, Vue  from 'vue-property-decorator';
import  mapState  from 'vuex';

@Component(
  // omit the namespace argument ('myModule') if you are not using namespaced modules
  computed: mapState('myModule', [ 
    'count',
  ]),
)
export default class MyComponent extends Vue 
  public count!: number; // is assigned via mapState

您也可以使用 mapState 根据您的状态创建新的计算:

import  Component, Vue  from 'vue-property-decorator';
import  mapState  from 'vuex';
import  IMyModuleState  from '@/store/state';

@Component(
  computed: mapState('myModule', 
    // assuming IMyModuleState.items
    countWhereActive: (state: IMyModuleState) => state.items.filter(i => i.active).length,
  ),
)
export default class MyComponent extends Vue 
  public countWhereActive!: number; // is assigned via mapState

【讨论】:

但是如何使用组件注解来调用多个模块,例如,mapState?您定义的变量称为“计算”是否重要? @belvederef 只需多次调用它 ``` @Component( // 如果您不使用命名空间模块,请忽略命名空间参数 ('myModule'): ...mapState('myModule) ', ['count',]), ...mapState('anotherModule', ['count',]), )【参考方案2】:

更容易使用 JS Spread syntax:

<template>
  <div class="hello">
    <h2> custom </h2>
    </div>
</template>

<script lang="ts">
import  Component, Prop, Vue  from 'vue-property-decorator';
import  mapState  from 'vuex';

@Component(
  computed: 
    ...mapState(
      title: 'stuff'
    ),
    // other stuff
  ,
)
export default class HelloWorld extends Vue 

  title!: string;

  public get custom():string 
    return this.title;
  

</script>

您的商店:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store(
  state: 
    stuff: 'some title',
  ,
  mutations: 

  ,
  actions: 

  ,
);

【讨论】:

以上是关于使用 vuex 时如何在 typescript 语法中使用 mapState 函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Vue 3 中使用 Vuex 4 模块和 TypeScript,以及如何修复循环依赖 linting 错误?

Typescript Vuex - 如何使用 setter 和 getter 定义状态?

如何在 Vuex 4 和 TypeScript 中使用其他存储模块 getter/actions/mutations

带有 Typescript 的 Vuex 存储类型

如何使用 vuex 和 typescript 将 axios 调用移动到自己的方法中

如何在单独的非 Vue 组件、JavaScript/TypeScript 文件中访问 Vuex 状态?