VUEX模块化

作者: RadishHuang | 来源:发表于2019-06-30 21:52 被阅读0次

vuex模块化官方文档

项目github地址

vuex的官网上,关于模块化和热重载的文档都是蛮详细的,这边也就不一一的搬砖,没啥意义。这边着重是介绍下项目中是如何使用以及模块之间的调用和模块如何引入。

  • 创建如下的文件结构。这个应该算是一个中规中矩的vuex推荐的文件目录。
文件结构
  • 除了module,其他的文件,可以理解为是主模块,或者是默认模块。通俗的将就是一些全局用到的状态或者信息,比如全局loading状态控制,全局的网页TDK(title、description、keywords)。或者用户的一些基本信息。

  • module可以根据实际项目中,进行模块化,比如可以每个页面有自己单独的模块。也可以根据类型划分模块,比如产品,产品详情等一个模块,新闻一个模块,用户信息一个模块。因项目的不同而划分模块。

    模块
  • 某个模块。写法也就是跟主模块一样。state/getters/actions/mutations 四大vuex的主要模块。这边需要特别注意的是namespaced。如果想要让该模块具有复用性,让其他模块也能调用,需要将namespaced设置为true


const state = {
    JokeList: []
}

const getters = {
    JokeList(state) {
        return state.JokeList;
    }
}

const actions = {
    async getJoke({ commit }) {
        const result = await modal.fetchJoke();
        if (result.code == 200 && result.result.length) {
            commit('setJoke', result.result);
        }
    },
}
const mutations = {
    setJoke(state, params) {
        state.JokeList = params;
    }
}

export default {
    namespaced: true,
    state,
    getters,
    actions,
    mutations
}
  • 导出store提供给vue的构造体使用。
import Vue from 'vue';
import Vuex from 'vuex';
import getters from './getters';
import actions from './actions';
import mutations from './mutations';
import defaultState from './state';
import home from './module/home';
import detail from './module/detail';
Vue.use(Vuex);
const isDev = process.env.NODE_ENV === 'development'
const store = new Vuex.Store({
        strict: isDev,
        state: defaultState,
        mutations,
        getters,
        actions,
        modules: {
            home,
            detail
        }
    })

  • 如何在页面中引入模块。与以往不同的是,我们在mapActionsmapState都需要对想要使用的模块进行声明。如果是主模块的内容,则就不需要加模块。

<script>

import { mapActions, mapState } from 'vuex';

export default {
    mounted () {
        this.getJoke();
    },
    methods: {
        ...mapActions({
            getJoke: 'home/getJoke',
            getMain: 'getMain',
        }),
    },
    computed: {
        ...mapState({
            JokeList: state => state.home.JokeList,
             mainState: state => state.mainState
        }),
    }
}
</script>
  • 顺便提下,模块之间action方法如何相互调用。通过dispatch,可以实现模块内部方法之间的项目调用。dispatch主要是实现actions方法之间的调用。commit主要是实现actions调用mutations方法。
const actions = {
    test1({ commit, dispatch }, params) {
        console.log('i am test1', params);
        dispatch('test2', params);
    },
    test2({ commit }, param) {
        console.log('i am test2', param);
    }
}
  • 模块如何调用主模块的方法。与普通的模块调用模块的方法其实都差不多,不管是用dispatch或者是用commit,只需要在结尾处加入{ root: true } 这个对象属性就能调用主组件的方法。
const actions = {
    getJokeDetail({ commit }, params) {

        //dispatch('setLoading', { root: true })
        commit(SET_LOADING, true, { root: true });
    },
}
  • 模块之间的方法相互调用。比如home模块调用detail模块的方法。只需要加模块的名称。
const actions = {
    getJokeDetail({ commit }, params) {
        //dispatch('detail/setLoading')
        commit('detail/setLoading');
    },
}

总结

vuex的模块化能让我们按照不同的业务,解耦出vuex的不同模块出来。模块之间的相互调用只需要将namespaced设置为true,就可以实现模块名称+方法名称的方法之间调用。使得我们更方便的管理不同模块之间的状态。

相关文章

  • 模块化vuex,获取、设置数据,及刷新保留数据方法

    前言 1.模块化vuex2.获取vuex中的数据3.设置vuex中的数据4.刷新之后,保留数据 模块化vuex 数...

  • VUEX模块化

    vuex模块化官方文档 项目github地址 在vuex的官网上,关于模块化和热重载的文档都是蛮详细的,这边也就不...

  • vuex相关文章

    vuex模块化和命名空间的实例代码

  • vuex持久化+模块化实战用法(进阶篇)

    上一篇:vuex刷新数据消失不见解决方案 Vuex模块化 模块化后的 store 大概长这样,如果画的不对,欢迎留...

  • vuex入门实例2

    vuex入门实例2 这章节我准备以requirejs模块化,讲解下如何快速上手vuex 源码地址 工程代码结构如下...

  • 2018-03-13

    Vuex 进阶——模块化组织 Vuex 前两篇讲解了一下 Vuex 的基本使用方法,可是在实际项目中那么写肯定是不...

  • vuex模块化

    上一节[https://www.jianshu.com/p/5dd561f3570d] modules modul...

  • vuex模块化

    demo store/modules/user.js 可以通过添加 namespaced: true 的方式使其成...

  • vuex模块化

    App.vue Count.vue Person.vue index.js count.js(只写count相关逻...

  • Vuex模块化

    目录 配置 在src目录下新建store文件夹,内部新建add.js、cut.js和index.js 其中主体的配...

网友评论

    本文标题:VUEX模块化

    本文链接:https://www.haomeiwen.com/subject/oocicctx.html