Nuxt 商店中的子文件夹弄乱了模块

Posted

技术标签:

【中文标题】Nuxt 商店中的子文件夹弄乱了模块【英文标题】:Subfolder in the Nuxt store is messing with the modules 【发布时间】:2019-09-06 01:22:19 【问题描述】:

尝试在 Nuxt 和 typescript 中创建一个项目。但是文档很差,我遇到了很多问题。不知何故能够解决其中的大部分问题,但遇到了 商店 的问题。根据 Nuxt 文档,存储目录中的每个文件都被转换为一个模块。

为了更好地组织我的项目,我决定在 store 文件夹中添加一个子文件夹。但是,在此更改之后,我的组件在调用 MutationAction 和从存储/模块获取值时遇到问题。

当我在 Vue 选项卡 (Vuex) 中检查开发人员控制台时,我可以看到我的 State 和 getter 在模块之前有子文件夹名称。

如果我决定将每个新模块/存储放在 store 文件夹中,一切都会正常工作。

我正在为我的模块使用vuex-module-decorators 包,因为我认为它提高了代码的可读性并简化了流程。

我得到的错误是:

[vuex] unknown action type: applicationStage/initializeArticles
[vuex] unknown mutation type: applicationStage/addArticle

所以问题是:

    我做错了吗? 我能否在 store 文件夹中有一个子文件夹,以及如何注册模块以在创建模块时跳过子文件夹名称?

我的商店文件夹结构

-store
--index.ts
--progress
---applicationStage.ts 

./store/progress/applicationStage.ts

import 
  Module,
  Action,
  VuexModule,
  Mutation,
  MutationAction
 from "vuex-module-decorators";

interface Article 
  title: string;
  body: string;
  published: boolean;
  meta: 
    [key: string]: string;
  ;


const articles = [
  
    title: "Hello World!",
    body: "This is a sample article.",
    published: true,
    meta: 
  ,
  
    title: "My writing career continues!",
    body: `...but I've run out of things to say.`,
    published: false,
    meta: 
  
];

@Module(
  name: "applicationStage",
  stateFactory: true,
  namespaced: true
)
export default class ApplicationStageModule extends VuexModule 
  articles: Article[] = [
    
      title: "Initial article",
      body:
        "This is the starting point, before we initialize the article store.",
      published: true,
      meta: 
    
  ];

  get allArticles() 
    return this.articles;
  

  get publishedArticles() 
    return this.articles.filter(article => article.published);
  

  @MutationAction( mutate: ["articles"] )
  async initializeArticles() 
    return  articles ;
  

  @Mutation
  addArticle() 
    this.articles.push(
      title: "Hello World 2!",
      body: "This is a sample article 2.",
      published: true,
      meta: 
    );
  

./components/HelloWorld.vue

<template>
  <div>
     message 
    <h2>Published articles</h2>
    <article v-for="article in articleList" :key="article.title">
      <h3 v-text="article.title"/>
      <div v-text="article.body"/>
    </article>
  </div>
</template>

<script lang="ts">
import  Component, Vue  from "vue-property-decorator";
import  getModule  from "vuex-module-decorators";
import ApplicationStageModule from "../store/progress/applicationStage";

@Component
export default class HelloWorld extends Vue 
  message: string = "Hello world !";
  articleStore = getModule(ApplicationStageModule, this.$store);
  articleList: any[] = [
    
      title: "Initial article",
      body:
        "This is the starting point, before we initialize the article store.",
      published: true,
      meta: 
    
  ];

  mounted() 
    this.articleStore.initializeArticles();  // ERROR LINE
    this.articleStore.addArticle();   // ERROR LINE
    this.updateArticles();
  

  public updateArticles() 
    this.articleList = this.articleStore.allArticles;
  

</script>

我创建了一个沙盒,可以在其中复制我的问题https://codesandbox.io/s/723xyzl60j

【问题讨论】:

你在一年前就问过这个问题,但你找到答案了吗?使用namespace 你会失去类型安全,这绝对不是我想要的...... 【参考方案1】:

您应该使用const applicationStage = namespace("progress/applicationStage/"); 而不是getModule(...)。 当stateFactorytrue 时,module 为“自动加载”。 您可能还需要直接在decorator 中注入商店。 嗯,当你使用stateFactory 时,namespaced 选项是无用的,因为stateFactory 存在 true,它将被命名空间

【讨论】:

以上是关于Nuxt 商店中的子文件夹弄乱了模块的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 更新到 4.3.2 弄乱了我的证书

PageSpeed 模块弄乱了图像的比例

Php 弄乱了我的上传大小

C# Process.Start 在批处理文件中弄乱了 URI

toolsVersion="11201" 弄乱了我的故事板

从 JS 文件访问 Nuxt 存储(在模块模式下)