【问题标题】:VueJS 3 with Vuex 4: State is not updating带有 Vuex 4 的 VueJS 3:状态未更新
【发布时间】:2021-02-10 19:47:18
【问题描述】:

我是 vueJS 的新手,我正在尝试在“标题”组件中创建动态 submenu

App.vue

<template>
    <div>
        <Header />

        <router-view />

        <Footer />
    </div>
</template>

我使用来自Vuex 的商店为我的submenu 项目设置全局状态

存储/index.js:

import { createStore } from 'vuex'

export default createStore({
    state: {
        cats_sub_menu: []
    },

    mutations: {
        SET_SUB_MENU(state, payload) {
            state.cats_sub_menu = payload;
       }
    },

   actions: {
       setSubMenu({ commit }, payload) {
          commit("SET_SUB_MENU", payload)
       }
   },
})

然后我设置了我的 Header 组件:

<template>
    <header>
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <router-link class="navbar-brand" to="/">Test Website</router-link>
            <button
                class="navbar-toggler"
                type="button"
                data-toggle="collapse"
                data-target="#navbarNav"
                aria-controls="navbarNav"
                aria-expanded="false"
                aria-label="Toggle navigation"
            >
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav">
                    <li>
                        <router-link
                            class="nav-link"
                            active-class="active"
                            to="/page/about-us"
                            >About</router-link
                        >
                    </li>
                    <li class="nav-item dropdown">
                        <a
                            class="nav-link dropdown-toggle"
                            href="#"
                            id="navbarDropdown"
                            role="button"
                            data-toggle="dropdown"
                            aria-haspopup="true"
                            aria-expanded="false"
                        >
                            Blog
                        </a>
                        <div
                            class="dropdown-menu"
                            aria-labelledby="navbarDropdown"
                        >
                            <router-link
                                class="dropdown-item"
                                active-class="active"
                                v-for="{ blogCat, i } in blog_sub_menu"
                                :key="i"
                                to="blog"
                                >{{ blogCat.title_el }}</router-link
                            >
                        </div>
                    </li>
                    <li>
                        <router-link
                            class="nav-link"
                            active-class="active"
                            to="/page/contact"
                            >Contact</router-link
                        >
                    </li>
                </ul>
            </div>
        </nav>
    </header>
</template>


<script>
    import { computed } from "vue";
    import axios from "axios";
    import store from "../../../store";
    export default {
        name: "Header",
        setup() {
            function setSubCatsMenu() {
                axios
                    .get(`http://127.0.0.1:5000/api/blog_category`)
                    .then((response) =>
                        store.dispatch("setSubMenu", response.data)
                    );
            }
            const blog_sub_menu = computed(() => store.state.cats_sub_menu);
            return {
                store,
                blog_sub_menu,
                setSubCatsMenu,
            };
        },
        mounted() {
            this.setSubCatsMenu();
        },
    };
</script>

我检查了 api 调用的有效性,没有任何问题,但 blog_sub_menu 仍然没有更新。有人有什么想法吗?

干杯!

【问题讨论】:

    标签: vue.js axios vuex vuejs3 vuex4


    【解决方案1】:

    blog_sub_menu 应该是一个计算属性以便反应:

    import axios from "axios";
    import store from "../../../store";   
    import {computed} from "vue"
    export default {
        name: "Header",
        setup() {
            function setSubCatsMenu() {
                axios
                   .get(`http://127.0.0.1:5000/api/blog_category`)
                   .then((response) =>
                    (store.dispatch("setSubMenu", response.data))
                );
            }
    
            const blog_sub_menu =computed(()=> store.state.cats_sub_menu);
    
            return {
                store,
                blog_sub_menu,
                setSubCatsMenu,
            };
        },
        mounted() {
            this.setSubCatsMenu();
            this.blog_sub_menu = store.state.cats_sub_menu;
        },
    };
    

    你的v-for 应该是这样的:

     v-for="( blogCat, i ) in blog_sub_menu"
    

    【讨论】:

    • 感谢您的回答@Boussadjra-Brahim,但我已经尝试过了。当我尝试遍历cats_sub_menu时,它给了我一个错误'blogCat is undefined' :(
    • 是的。抱歉没有早点分享。我在我的问题中更新了 Header 组件的代码。
    • 试试这个const blog_sub_menu = computed(() =&gt;( store.state.cats_sub_menu || []));,因为在第一次渲染时store.state.cats_sub_menu是未定义的
    • 不幸的是无法正常工作。我什至在声明时传递了静态数据,但仍然收到错误“blogCat is undefined”
    • 啊,好吧,我理解你的错,你应该在v-for="{ blogCat, i } in blog_sub_menu" 中将{} 替换为(),它应该是v-for="( blogCat, i ) in blog_sub_menu"
    猜你喜欢
    • 2017-05-20
    • 2019-03-20
    • 2020-12-18
    • 2017-07-31
    • 2020-09-08
    • 2023-03-16
    • 1970-01-01
    • 2021-06-19
    • 2018-05-13
    相关资源
    最近更新 更多