... Vue-TypeScript 应用程序中的 mapActions 导致错误

Posted

技术标签:

【中文标题】... Vue-TypeScript 应用程序中的 mapActions 导致错误【英文标题】:...mapActions in Vue-TypeScript application cause error 【发布时间】:2020-07-18 13:44:28 【问题描述】:

我正在尝试在 Vue-Typescript 应用程序中创建身份验证功能。对于这个特性,我创建了一个 Vuex 存储模块“AuthModule”。我已将 Vuex 操作映射到类组件方法。但是当我从其他类方法调用这些操作时,它会抛出如下错误。

Property 'login' does not exist on type 'AuthView'.
    70 |                 rememberMe: this.rememberMe
    71 |             ;
  > 72 |             this.login(user)
       |              ^
    73 |                 .then(() => this.$router.push('/home'))
    74 |                 .catch(err => console.log(err))
    75 |         

AuthModule 商店

import Action, Module, Mutation, VuexModule, getModule from "vuex-module-decorators";
import Api from "@/helpers/Api";
import axios from "axios";
import User from "@/dao/User";
import store from '@/store'


@Module(dynamic: true, store, name: "AuthModule", namespaced: true)

class AuthModule extends VuexModule 
    public token = localStorage.getItem('token') || '';
    public status = '';
    public user = new User();
    public isLoggedIn = false;

    @Mutation
    public authRequest(): void 
        this.status = 'loading'
    

    @Mutation
    public authSuccess(token: string, user: User): void 
        this.token = token;
        this.user = user;
        this.isLoggedIn = true;
    

    @Mutation
    public authError() 
        this.status = 'error'
    

    @Action(rawError: true)
    public login(user: any) 
        return new Promise((resolve, reject) => 
            this.context.commit('authRequest');
            return Api.post('/auth/login', user)
                .then(resp => 
                    const token = resp.data.accessToken;
                    const user = new User();
                    user.firstName = resp.data.firstName;
                    user.lastName = resp.data.lastName;
                    user.UserId = resp.data.userId;
                    localStorage.setItem('token', token);
                    Api.defaults.headers.common['Authorization'] = 'Bearer ' + token;
                    this.context.commit('authSuccess', token, user);
                    resolve(resp)
                )
                .catch(err => 
                    this.context.commit('authError');
                    localStorage.removeItem('token');
                    reject(err)
                )
        )
    

存储 index.ts

import Vue from 'vue'
import Vuex from 'vuex'
import authModule from "./auth/AuthModule";

Vue.use(Vuex);


export default new Vuex.Store(
    modules: 
        authModule
    
)

Login.ts

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

    @Component(
        methods: 
            ...mapActions('authModule', ['login'])
        
    )
    export default class AuthView extends Vue 
        private email = "";
        private password = "";
        private rememberMe = "";

        public login(user:object) ;

        performLogin() 
            const user = 
                email: this.email,
                password: this.password,
                rememberMe: this.rememberMe
            ;
            this.login(user)
                .then(() => this.$router.push('/home'))
                .catch(err => console.log(err))
        
    
</script>

如果有人遇到这样的问题,请提出解决方案。

【问题讨论】:

【参考方案1】:

在您的 AuthModule.store 中,您应该使用 getModule 导出商店,即:

export const authModuleStore = getModule(AuthModule);

然后,您可以直接在组件中导入authModuleStore 并直接引用其方法:

import  authModuleStore  from '/path/to/authModule.store';

export default class AuthView extends Vue 
    private email = "";
    private password = "";
    private rememberMe = "";

    public login(user:object) ;

    performLogin() 
        const user = 
            email: this.email,
            password: this.password,
            rememberMe: this.rememberMe
        ;
        authModuleStore .login(user)
            .then(() => this.$router.push('/home'))
            .catch(err => console.log(err))
    

【讨论】:

这是解决上述问题的另一种方法。我被接受并且之前已经实施过。但是有没有可能在我的类组件中使用...mapActions 我认为 mapActions 的主要问题是 TypeScript 无法检测到其中声明的任何内容都可以映射为方法,即从 @Component 声明中查找类型时遇到问题 我认为最好的方法是你的答案。但我正在使用动态存储模块。所以我不能在 main.ts 中使用这些模块(即 Vue 应用程序的启动脚本)。抛出很多错误。

以上是关于... Vue-TypeScript 应用程序中的 mapActions 导致错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 webpack 别名的 Vue-typescript 错误,找不到路径

从 Firebase 中的 SafetyNet 注销应用程序检查中的应用程序

“/”应用程序中的服务器错误。

iphone中的UITableView中的多行选择和删除,就像iphone中的邮件应用程序一样

“/”应用程序中的服务器错误。

“/BookShop”应用程序中的服务器错误。 -------------------------------------------------------------