vuex 未加载用 vuex-module-decorators 装饰的模块

2024-01-15

当尝试将带有 vuex-module-decorators 的存储模块加载到初始化程序中时,我收到此错误:

vuex.esm.js?2f62:261 未捕获类型错误:无法读取属性 Array.forEach 的 eval (vuex.esm.js?2f62:261) 处未定义的“getters” () 在assertRawModule (vuex.esm.js?2f62:260) 处 ModuleCollection.register (vuex.esm.js?2f62:186) 在 eval (vuex.esm.js?2f62:200) 在 eval (vuex.esm.js?2f62:75) 在 Array.forEach () 在 forEachValue (vuex.esm.js?2f62:75) 在 ModuleCollection.register (vuex.esm.js?2f62:199) 在新的 ModuleCollection (vuex.esm.js?2f62:160)

index.ts 文件非常简单,并且在我将模块引入初始化程序之前一切正常:

import Vue from 'vue';
import Vuex from 'vuex';
import { AuthenticationModule, IAuthenticationState } from './modules/authentication';
import VuexPersistence from 'vuex-persist';

Vue.use(Vuex);

export interface IRootState {
  authentication: IAuthenticationState;
}

const vuexLocal = new VuexPersistence({
  storage: window.localStorage,
});

const store = new Vuex.Store<IRootState>({
  modules: {
    authentication: AuthenticationModule, // if this is not here it works but this will mean the vuex-persist will not work
  },
  plugins: [vuexLocal.plugin],
});

export default store;

这是我认为引发错误的身份验证模块:

import { Action, getModule, Module, Mutation, VuexModule } from 'vuex-module-decorators';
import { Generic422, LoginEmailPost, RegisterPost, TokenRenewPost, User, UserEmailPut, UserPasswordPut, UserPut } from '@/api/ms-authentication/model/models';
import { Api } from '@/services/ApiHelper';
import Auth from '@/services/Auth';
import store from '@/store';

export interface IAuthenticationState {
  user: User;
  authenticated: boolean;
  prompt: {
    login: boolean,
  };
  errorRegister: Generic422;
  errorLogin: Generic422;
}

const moduleName = 'authentication';

@Module({dynamic: true, store, name: moduleName})
class Authentication extends VuexModule implements IAuthenticationState 
{
  public authenticated: boolean = false;
  public errorRegister: Generic422 = {};
  public errorLogin: Generic422 = {};
  public prompt = {
    login: false,
  };
  public user: User = {
    email: '',
    firstName: '',
    lastName: '',
    birthday: '',
    verified: false,
  };
  @Action({commit: 'SET_USER'})
  public async login(data: LoginEmailPost) {
    try {
      const resp = await Api.authenticationApi.v1LoginEmailPost(data);
      Auth.injectAccessJWT(resp.data.tokenAccess.value);
      Auth.injectRenewalJWT(resp.data.tokenRenewal.value);
      return resp.data.user;
    } catch (e) {
      return e.statusCode;
    }
  }
  @Mutation
  public SET_USER(user: User) {
    this.authenticated = true;
    this.user = {...this.user, ...user};
  }
}

export const AuthenticationModule = getModule(Authentication);

我从以下位置获取了此设置:https://github.com/calvin008/vue3-admin https://github.com/calvin008/vue3-admin

我不知道这是一个错误还是一个设置问题,但完全卡在这里,因为我打算在页面重新加载后使用 vuex-persist 来“补充”商店。

使用此库声明存储的另一种完全不同的方式如下:https://github.com/eladcandroid/typescript-vuex-example/blob/master/src/components/Profile.vue https://github.com/eladcandroid/typescript-vuex-example/blob/master/src/components/Profile.vue但是当在 vue3-admin 中它的语法似乎会变得非常冗长,它完全位于与组件相反的存储中。

目前,我已将所有状态很好地保存到本地存储中,但由于此错误或缺乏示例,我不知道如何使用此存储的数据补充存储:/

似乎有两种使用装饰器的方法,但两者都有很大不同。我喜欢我从 vie 管理员那里找到的方法,因为组件漂亮干净,但我无法注入模块https://www.npmjs.com/package/vuex-persist#detailed https://www.npmjs.com/package/vuex-persist#detailed国家应该这样做:/


我发现答案是示例 vue 管理应用程序的结构不太正确。

相反,从模块中导出类:

@Module({ name: 'authentication' })
export default class Authentication extends VuexModule implements IAuthenticationState {

然后将类作为模块注入到索引中,并通过装饰器导出模块,同时还将存储注入到所述装饰器中:

import Vue from 'vue';
import Vuex from 'vuex';
import Authentication from './modules/authentication';
import VuexPersistence from 'vuex-persist';
import { getModule } from 'vuex-module-decorators';

Vue.use(Vuex);

const vuexLocal = new VuexPersistence({
  storage: window.localStorage,
});

const store = new Vuex.Store({
  modules: {
    authentication: Authentication,
  },
  plugins: [vuexLocal.plugin],
});

export default store;
export const AuthenticationModule = getModule(Authentication, store);

结果是一切正常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vuex 未加载用 vuex-module-decorators 装饰的模块 的相关文章

  • Vuex 动作与突变

    在Vuex中 同时拥有 动作 和 变异 的逻辑是什么 我理解组件无法修改状态的逻辑 这看起来很聪明 但是同时具有操作和突变似乎您正在编写一个函数来触发另一个函数 然后更改状态 动作 和 突变 之间有什么区别 它们如何协同工作 而且我很好奇为
  • 默认参数装饰器 python

    Python 3 6 我正在尝试创建一个装饰器 自动将参数的字符串指定为默认值 such as def example one one two two three three pass 相当于 DefaultArguments def ex
  • 为什么 Python 装饰器不能跨定义链接?

    为什么以下两个脚本不等效 摘自另一个问题 了解 Python 装饰器 https stackoverflow com questions 739654 understanding python decorators def makebold
  • 与 Vuex-ORM 的两种方式数据绑定

    有谁知道使用时在表单中实现双向数据绑定的库或已经描述的模式Vuex ORM https vuex orm github io vuex orm 我找到了几个可以帮助解决 Vuex 问题的库 但还没有专门针对 Vuex ORM 的库 vuex
  • Python 将 args 转换为 kwargs

    我正在编写一个装饰器 它需要在调用它正在装饰的函数之前调用其他函数 装饰函数可以具有位置参数 但装饰器将调用的函数只能接受关键字参数 有人有一种将位置参数转换为关键字参数的便捷方法吗 我知道我可以获得修饰函数的变量名列表 gt gt gt
  • 装饰器可以装饰递归函数吗?

    我想看看两种计算斐波那契数列的方法之间的时间成本差异 首先 我创建了一个装饰器 将 输出时间成本 函数添加到函数中 def time cost func def wed n start time time func n stop time
  • Typescript 属性装饰器可以为类设置元数据吗?

    在打字稿中 是否可以使用属性装饰器来设置类的元数据 考虑下面的代码 类装饰器的 目标 显然与属性装饰器的 目标 不同 我可以从另一个派生出一个吗 import reflect metadata const MY CLASS DECORATO
  • Django自定义装饰器重定向问题

    我尝试在 Django 中编写一个自定义装饰器 如果用户未通过该页面登录 我想将用户重定向到自定义登录页面 我已经编写了装饰器并调试了它 虽然如果用户未登录 它可以正常工作 但在用户登录后 它会给出错误 The view APPNAME v
  • 如何在责任链中注入下一个处理程序的依赖关系?

    在我当前的项目中 我使用了相当多的责任链模式 然而 我发现通过依赖注入配置链有点尴尬 给定这个模型 public interface IChainOfResponsibility IChainOfResponsibility Next ge
  • 如何组合多个 TypeScript 类装饰器?

    我有一个类装饰器家族 我在很多类中重复使用它们 与此类似的东西 foo bar baz export class MyClass 由于我在多个类中使用这三个装饰器 我真的很想将其分解为一个装饰器 如下所示 standard export c
  • 声明静态成员的类装饰器(例如,对于 log4net)?

    我正在使用 log4net 我们的代码中有很多这样的内容 public class Foo private static readonly ILog log LogManager GetLogger typeof Foo 一个缺点是 这意味
  • 如何使用和应用 JavaScript 装饰器?

    我试图了解如何在一段非常简单的代码中使用装饰器 这样我就可以将这个概念应用到我更大的项目中 从 Addy Osmani 的文章中得到启发here https medium com google developers exploring es
  • python setattr 用于带有装饰器的动态方法创建器

    我有一个定义了多个方法的类 import mat class Klass object mat sell mat CanSet def method1 self return None mat sell mat CanSet def met
  • 如何将复选框绑定到Vuex存储?

    我有一个包含一些复选框的组件 我需要能够访问从 Vue 应用程序中的其他组件检查了哪些复选框 但我无法弄清楚 也无法在网上找到 如何将复选框正确连接到我的 Vuex 商店 将组件内的复选框连接到 Vuex 存储的正确方法是什么 以便它们的行
  • 使用装饰器将类方法包装在 try / except 中

    我有一个通用函数 可以将有关异常的信息发送到应用程序日志 我用exception handler来自类中方法的函数 传入并由应用程序调用的应用程序日志处理程序exception handler创建一个 JSON 字符串 该字符串是实际发送到
  • 如果不刷新页面,Vuex 状态不会更新

    我正在构建一个单页面应用程序 用户可以根据他们是否登录来看到不同的页面 登录调用工作正常 授权令牌保存在本地存储中 设置 我已经设置了一个名为的吸气剂loggedIn返回true如果在状态上设置了令牌 这是我的确切代码auth js商店模块
  • 使用vuex时如何在typescript语法中使用mapState函数?

    我在与 vuex 集成的 vuejs 项目中使用 typescript 语法 我想使用 ts 文件中计算的 mapState 方法 但出现语法错误 目前我正在使用文档建议的计算函数语法 我的意思是 get counter return th
  • Python 装饰器只是语法糖? [复制]

    这个问题在这里已经有答案了 可能的重复 了解 Python 装饰器 https stackoverflow com questions 739654 understanding python decorators 我对使用 Python 装
  • Typescript,装饰异步函数

    我正在尝试用一些异步函数 2 来装饰异步函数 1 E g function func2 param return target any propertyKey string descriptor PropertyDescriptor gt
  • 如何使用温莎城堡注册通用装饰器?

    我需要装饰一切基于ICommandHandler

随机推荐