Vuex 4,组件中的状态为空

Posted

技术标签:

【中文标题】Vuex 4,组件中的状态为空【英文标题】:Vuex 4, State is empty in component 【发布时间】:2021-05-12 21:58:06 【问题描述】:

我正在尝试使用我的 home 组件中的 this.$store.state.subjects 访问主题存储状态,但是它显示为一个空数组。使用 console.log 唯一能看到 state.subjects 填充的地方是它是否在突变函数中。 在其他任何地方,console.log 都是空的。在我看来,状态并没有从突变中持续存在,但我不确定为什么。

我已经尝试了很多 *** 答案,但是没有一个可以解决问题,或者我不知道我在帖子中阅读的内容。我还保留了代码块中的代码,以使这篇文章更具可读性,例如导入或模板。

存储 index.js

export default createStore(
    state: 
        subjects: [],
    ,
    actions: 
        getSubjects( commit ) 
            // Manages subjects, allow for display in column or Calendar view
            axiosMain(
                method: "get",
                url: "/study/",
                withCredentials: true,
            )
                .then((response) => 
                    commit("setSubjects", response.data);
                )
        ,
    ,
    mutations: 
        setSubjects(state, subjectsToSet) 
            state.subjects = subjectsToSet;
            console.log(state.subjects) # Is a populated array
        
    
);

Main.js

import  createApp  from "vue";
import App from "./App.vue";
import router from "./router";
import VueGtag from "vue-gtag-next";
import store from "./store";
import "./assets/main.css";

createApp(App)
    .use(router)
    .use(store)
    .use(VueGtag, 
        property: 
            id: "G-E4DPXQ96HB",
        ,
    )
    .mount("#app");

首页.vue

<template>
</template>

<script>
export default 
    name: "Home",
    data() 
        return 
            subjects: [],
        ;
    ,
    mounted() 
        this.callStoreSubjectAction();
        this.setSubjectsToStoreSubject();
    ,
    methods: 
        callStoreSubjectAction() 
            this.$store.dispatch("getSubjects");
        ,
        setSubjectsToStoreSubject() 
            this.subjects = this.$store.state.subjects;
            console.log(this.$store.state.subjects); # Is an empty array
        ,
    ,
;
</script>

【问题讨论】:

【参考方案1】:

在组件中,您将在 axios 调用完成之前复制 this.$store.state.subjects 的值。等待承诺首先解决。为此,您需要首先从操作中返回承诺:

getSubjects( commit ) 
  return axiosMain(   // returning the promise
    ... 
  

等待承诺:

mounted() 
  this.$store.dispatch("getSubjects").then(r => 
    this.subjects = this.$store.state.subjects;
    console.log(this.$store.state.subjects);
  );
,

比这更好的是从组件数据中删除 subjects 并使用计算来与 Vuex 状态同步:

import  mapState  from 'vuex';
computed: 
  ...mapState(['subjects'])  // creates a computed `this.subjects`

那么你只需要调度动作,组件会处理剩下的事情:

mounted() 
  this.$store.dispatch("getSubjects");

【讨论】:

让我们continue this discussion in chat.

以上是关于Vuex 4,组件中的状态为空的主要内容,如果未能解决你的问题,请参考以下文章

确保在渲染组件之前加载 Vuex 状态

linux字符测试

检查存储 vuex 的 json 数组是不是为空

使用 Vue + Vuex 在渲染之前无法获取对象的状态属性

注册 Vuex 模块的问题,要么找不到命名空间,要么 getters.default 为空

如何清除 vuex 商店中的状态?