vuex-модуль-декораторы: Хранение не предусмотрено в параметрах декоратора при использовании динамической опции

#typescript #vue.js #vuex #vuex-modules #vuex-module-decorators

Вопрос:

Я новичок в Vue и пытаюсь использовать его в качестве интерфейса для созданного мной API. Я следовал нескольким руководствам и читал множество примеров из разных источников, и, похоже, ничего из того, что я пробовал, не работает, поэтому я не уверен, где я ошибаюсь.

По сути, происходит то, что при загрузке страницы я получаю сообщение об ошибке в консоли моего браузера:

 Uncaught Error: Store not provided in decorator options when using dynamic option  

Трассировка стека говорит мне, что это происходит из моего Tags модуля. Что не имеет смысла, так это то, что я предоставил объект магазина. Если я попытаюсь удалить модуль dynamic: true из модуля, я получу новую ошибку:

 Uncaught Error: ERR_STORE_NOT_PROVIDED: To use getModule(), either the module  should be decorated with store in decorator, i.e. @Module({store: store}) or  store should be passed when calling getModule(), i.e. getModule(MyModule, this.$store)  

Если я не использую getModule и просто экспортирую класс, я получу другую ошибку:

 Uncaught (in promise) Error: ERR_ACTION_ACCESS_UNDEFINED: Are you trying to access this.someMutation() or this.someGetter inside an @Action?  That works only in dynamic modules.  If not dynamic use this.context.commit("mutationName", payload) and this.context.getters["getterName"]  

Эта ошибка говорит мне, что мне нужен динамический модуль, и при повторной настройке dynamic: true я возвращаюсь к первой ошибке.

Весь соответствующий код можно найти ниже. Кто-нибудь может мне в этом помочь? Я совершенно потерялся.

 // @/main.ts import { createApp } from 'vue' import { sync } from 'vuex-router-sync' import App from './App.vue' import router from './router' import store from './store' import './assets/app.css'  sync(store, router)  createApp(App).use(store).use(router).mount('#app')  
 // @/store/index.ts import { createStore } from 'vuex' import createPersistedState from 'vuex-persistedstate' import tags from '@/store/tags'  export default createStore({  state: {  baseUrl: '/api/v1',  },  mutations: {},  actions: {},  modules: {  tags,  },  plugins: [  createPersistedState(),  ], })  
 // @/store/tags.ts import { Action, getModule, Module, Mutation, VuexModule } from 'vuex-module-decorators' import HTTP from '@/http' import store from '@/store'  interface Tag {  foo: string  bar: string }  @Module({  namespaced: true,  name: 'tags',  store,  dynamic: true, }) class TagsModule extends VuexModule {  tags: Tag[] = []   @Action({ commit: 'setTags' })  async fetchTags(): Promiselt;Tag[]gt; {  return HTTP().get('/tags')  }   @Mutation  setTags(tags: Tag[]): void {  this.tags = tags  } } export default getModule(TagsModule)  

Комментарии:

1. Первое, что вам нужно проверить в сторонних библиотеках,-это для какой версии они предназначены. Это для Vue2, в то время как вы, очевидно, используете Vue 3

2. @EstusFlask Ну, это неловко, если это так. Я видел, как кто-то рекомендовал его другому человеку, пока я искал решения другой проблемы. Нигде не указано, что это специально для Vue2 или не для Vue3. Я полагаю, вы не можете порекомендовать другую библиотеку? Модули Vuex с объявлениями типов Typescript-это абсолютный беспорядок.

3. Если в нем не указана версия Vue, это означает, что он был написан, когда Vue 3 не был опцией. Это может быть подтверждено версией vue в пакете lib.json и проблемами «Vue 3???» в репо. Я не знаю об альтернативах, и на самом деле у самих декораторов TS проблемы с типом. Вы можете проверить Pinia, у него есть api, дружественный к TS, который близок к тому, что ожидается от Vuex 5.

4. @EstusFlask Быстро дал Пинию попробовать, прежде чем мне пришлось прекратить работать над этим, и, похоже, это сработало! Спасибо за это.