解决Vue+ts里面this.$store问题

解决 Vue + TypeScript 中 this.$store 问题

在Vue + TypeScript中使用this.$store访问 Vuex store 中的状态或者调用 mutation/action 方法时,可能会遇到this.$store失效的问题。本文将介绍如何解决这个问题。

问题分析

在 Vue + TypeScript 中,类的方法默认使用严格模式,因此调用该类方法时, this 的值将会是 undefined,而不是组件实例,所以当我们从组件中访问 this.$store 的时候,会返回 undefined。

解决方案

为了解决 this.$store 失效的问题,我们需要在项目中添加一些类型声明和配置修改。

  1. 在 vue.d.ts 中添加 $store 的类型声明

在 src 目录下创建一个 vue.d.ts 文件,并添加以下内容:

import { Store } from 'vuex';

declare module 'vue/types/vue' {
  interface Vue {
    $store: Store<any>;
  }
}

该文件将会扩展 Vue 类型,并将 $store 定义为 Store 类型。这样一来,我们就能使用 this.$store 访问 Vuex 的 store。

  1. 修改 tsconfig.json 文件

在 tsconfig.json 文件中添加 "noImplicitThis": false 选项,以去除 TypeScript 中的严格模式。

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "jsx": "preserve",
    "strict": true,
    "noImplicitThis": false
  }
}

示例说明

  1. 访问 Vuex store 中的状态

假设我们的 Vuex store 中有一个 count 状态,我们在组件中通过 this.$store 访问该状态,代码如下:

import { VuexModule, Module, Action, Mutation } from 'vuex-module-decorators';
import store from '@/store';

@Module({ dynamic: true, namespaced: true, store, name: 'counter' })
class Counter extends VuexModule {
  count = 0;

  @Mutation
  increment(delta: number) {
    this.count += delta;
  }

  @Mutation
  decrement(delta: number) {
    this.count -= delta;
  }

  @Action
  async incrementAsync(delta: number) {
    return new Promise((resolve) => {
      setTimeout(() => {
        this.increment(delta);
        resolve();
      }, 1000);
    });
  }

  @Action
  decrementAsync(delta: number) {
    return new Promise((resolve) => {
      setTimeout(() => {
        this.decrement(delta);
        resolve();
      }, 1000);
    });
  }
}

export default Counter;

发现 VS Code 编辑器报错,提示 TS2339: Property 'count' does not exist on type 'undefined'。这是因为在此处的 this 指向的是类内部,不是指向组件实例。为了解决该问题,添加 vue.d.ts 文件并在 tsconfig.json 文件中添加"noImplicitThis": false 选项,即可解决此问题。

  1. 调用 Vuex store 中的 mutation 方法

现在我们来看一个组件中调用 Vuex store 中的 mutation 方法的示例:

import { Component, Vue } from 'vue-property-decorator';

@Component
export default class CounterComponent extends Vue {
  get count() {
    return this.$store.state.counter.count;
  }

  increment() {
    this.$store.commit('counter/increment', 1);
  }

  decrement() {
    this.$store.commit('counter/decrement', 1);
  }
}

在此代码中,当调用 this.$store.commit 方法时,this 的值指向的是 undefined,为了解决该问题,同样需要添加 vue.d.ts 文件并在 tsconfig.json 文件中添加"noImplicitThis": false 选项,即可解决此问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决Vue+ts里面this.$store问题 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • 解决Swagger2返回map复杂结构不能解析的问题

    问题描述: 在使用Swagger2进行接口文档生成时,如果返回结果是Map类型并且其中的value为自定义复杂对象时,Swagger2会无法将返回结果正确解析成json格式,从而导致无法正常生成接口文档。 解决方案: 使用Swagger2提供的注解 @ApiOperation(value=”接口名称”,notes=”接口说明”) 来标记接口,并在注解中使用 …

    http 2023年5月13日
    00
  • maven引入本地jar包运行报错java.lang.NoClassDefFoundError解决

    当我们开发Java程序时,经常会使用到第三方的库,这些库通常是以JAR包的形式提供的。在使用Maven构建项目时,我们可以通过在pom.xml文件中添加依赖来引入这些库。 但有时候我们需要引入本地的JAR包,比如自己编写的一些工具类或第三方库不在Maven中央仓库中,就需要将其放到项目的本地库中,然后通过Maven引入。但是有时会遇到引入本地JAR包运行报错…

    http 2023年5月13日
    00
  • 关于javaWeb中405错误的解决方法

    在Java Web开发中,有时候会遇到405错误,这通常是由于请求方法不被允许导致的。以下是一个关于Java Web中405错误的解决方法的攻略,其中包含了一些示例。 关于Java Web中405错误的解决方法 在Java Web开发中,如果遇到405错误,可以尝试以下解决方法: 方案1:检查请求方法 405错误通常是由于请求方法不被允许导致的。您可以检查请…

    http 2023年5月13日
    00
  • 解决在vue项目中,发版之后,背景图片报错,路径不对的问题

    当我们在Vue项目中发版之后,有时候会遇到背景图片报错,路径不对的问题。这通常是由于路径配置不正确或者图片资源没有正确打包导致的。本文将提供详细的解决方,包检查路径配置和检查图片资源打包,同时提供两个示例说明。 解决方案1:检查路径配置 当我们到背景图片报错,路径不对的问题时,我们应首先检查路径配置。路径配置不正确可能导致浏览器无正确加载图片资源,从而导致背…

    http 2023年5月13日
    00
  • 什么是OCSP Stapling?

    OCSP Stapling是一种可以提高TLS协议安全性的技术。它通过缓存OCSP证书响应的方式,减少客户端与服务器之间的通信,提高TLS握手的速度和安全性,避免了使用传统OCSP协议可能引发的漏洞。 OCSP Stapling的基本原理是,Web服务器提前从签发证书的CA服务器获取OCSP响应,然后将其缓存到本地,并在TLS握手时向客户端发送OCSPRes…

    云计算 2023年4月27日
    00
  • Maven中Could not find artifact XXXX的错误解决

    当我们在使用Maven构建项目时,有时会遇到“Could not find artifact XXXX”的错误。这个错误通常是由于Maven无法找到所需的依赖项而引起的。以下是解决这个问题的完整攻略: 步骤1:检查Maven配置 首先,我们需要检查Maven的配置是否正确。我们可以检查以下几个方面: 检查Maven的settings.xml文件是否正确配置了…

    http 2023年5月13日
    00
  • 解读SpringBoot接收List参数问题(POST请求方式)

    下面是详细的攻略。 解读 SpringBoot 接收 List\ 参数问题 当我们在开发Web应用时,经常需要处理从前端接收到的参数。在某些情况下,我们可能需要接收一个 List<Bean> 类型的参数。本文将介绍如何正确处理这种情况。 HTTP POST 请求 HTTP 是一个无状态的协议,每个 HTTP 请求应该是独立的。在 Web 应用中,…

    http 2023年5月13日
    00
  • express框架,报错:“Cannot set headers after they are sent to the client”,解决方法总结 原创

    Express框架是一个流行的Web应用程序框架,可以帮助开发人员快速高效地构建可扩展的Web应用程序。然而,有时候在使用Express框架时,会出现一个“Cannot set headers after they are sent to the client”错误,这个错误通常出现在尝试在响应已经发送到客户端之后再次设置HTTP标头的情况下。本文将为您提供…

    http 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部