NuxtServerInit 不适用于 Vuex 模块模式 - Nuxt.js

Màn*_*dàn 10 vue.js vuex nuxt.js vuex-modules

NuxtServerInit 不适用于 nuxt js vuex 模块模式下的初始页面渲染。但它适用于经典模式。以下代码是我使用的流程。

我的api调用

api/CategoryApi.js

import axios from 'axios';

const HEADERS = {
    Accept: 'application/json'
};

export default {
    getCategory(payload) {
        return axios.get(`${process.env.apiUrl}/category`, {
            payload,
            headers: HEADERS
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

商店/模块/CategoryStore.js

import api from '~/api/CategoryApi'

const state = () => ({
    categories: []
});

const getters = {
    allCategories: state => state.categories
};

const actions = {
    async nuxtServerInit({commit}) {
        const payload = {
            per_page: 6,
            page: 1
        };
        const response = await api.getCategory(payload);
        commit('setCategories', response.data.data);
    },
};

const mutations = {
    setCategories: (state, data) => {
        state.categories = data;
    }
};

export default {
    state,
    getters,
    actions,
    mutations
}
Run Code Online (Sandbox Code Playgroud)

页面/index.vue

<template>
    <div>
        <v-flex xs6 sm4 md2 class="text-xs-center my-2 pa-2" v-for="category in allCategories" :key="category.id">
            {{ category.name }}
        </v-flex>
    </div>
</template>

<script>
    import { mapGetters } from 'vuex';

    export default {
        layout: 'default',
        computed: {
            ...mapGetters({
                allCategories: 'modules/CategoryStore/allCategories',
            })
        },
    }
</script>
Run Code Online (Sandbox Code Playgroud)

我这样做错了吗?:/我想知道实现这一点的正确方法。

编辑:我如何处理 Aldarund 答案(这可能对某人有所帮助)

编辑 store/modules/CategoryStore.js

const actions = {
    async fetchCategories({commit}) {
        const payload = {
            per_page: 6,
            page: 1
        };
        const response = await api.getCategory(payload);
        commit('setCategories', response.data.data);
    },
};
Run Code Online (Sandbox Code Playgroud)

添加 store/index.js

const actions = {
    async nuxtServerInit({dispatch}) {
        await dispatch('modules/CategoryStore/fetchCategories');
    },
};

export default {
    actions
}
Run Code Online (Sandbox Code Playgroud)

Ald*_*und 14

正如文档中所说

如果您使用 Vuex 商店的模块模式,则只有主模块(在 store/index.js 中)会收到此操作。您需要从那里链接您的模块操作。

所以你需要将你的 nuxtServerInit 放入 store/index.js

  • 您能否举个例子来说明如何做到这一点。 (3认同)
  • @Aldarund不确定您的示例是否已更改,但它似乎并未处于模块模式? (3认同)
  • @Ninja 它在文档和示例中。https://github.com/nuxt/nuxt.js/blob/b83b5675043ebdfec3398bd83fd27dfe77cdd620/examples/auth-routes/store/index.js (2认同)