Vue.js-Vuex延迟加载

时间:2018-07-20 14:55:04

标签: vue.js vuejs2 vue-router vuex

我有一个相当大的VueJS SPA,我只是想使用延迟加载在某些路由上加载vuex模块。

我一直在关注这篇文章,以重制本文-https://alexjoverm.github.io/2017/07/16/Lazy-load-in-Vue-using-Webpack-s-code-splitting/

但是这给我带来了vuex错误。

文件夹结构

root
  |- store
  | |- modules
  | | |- auth.js
  | | |- module2.js
  | |- store.js
  |- app.js

auth.js

const state = {
    var1: {},
    var2: false
}

const mutations = {
    'MUTATION_1'(state, obj) {
        // logic
    }
}

const actions = {
    action1({commit}) {
       // logic
    }
}

const getters = {
    var1: state => state.var1,
    var2: state => state.var2
}

export default {
    state,
    mutations,
    actions,
    getters
}

store.js-

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);
const store = new Vuex.Store();

import('./modules/auth.js').then(auth => {
    store.registerModule('/login', auth);
});

export default store;

app.js-

import Vue from 'vue';
import store from './store/store';
import VueRouter from 'vue-router';
import { routes } from './routes/routes';

// vue-router config
Vue.use(VueRouter);

const router = new VueRouter({
    mode: 'history',
    routes
});

const app = new Vue({
    el: '#app',
    store,
    router
});

错误-

[vuex] unknown getter: var1

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

store.registerModule('/login', auth);

上面的代码将auth模块注册到名称为login的模块中,因此,要从存储中访问其状态,获取器,突变和操作,必须在所有模块前面加上路径前缀login/。之所以出错,是因为您应该在应该打电话给store.getters.var1的情况下尝试store.getters['login/var1']

答案 1 :(得分:1)

Getter在加载登录模块之前被调用。发生这种情况是因为import()是异步函数,并且在创建计算观察程序之后的某个时间注册了该模块。 组件计算的吸气剂中的return store.state.login && store.getters['login/var1']将首先为您的组件订阅store.state的更改,然后在加载并注册登录模块后store.state将更改并触发组件计算的吸气剂,并自动订阅任何{{1} }更改