当前位置: 首页 > news >正文

【转】大型Vuex项目 ,使用module后, 如何调用其他模块的 属性值和方法

Vuex 允许我们把 store 分 module(模块)。每一个模块包含各自的状态、mutation、action 和 getter。

那么问题来了, 模块化+命名空间之后, 数据都是相对独立的, 如果想在模块 A 调用 模块 B 的state, actions, mutations, getters, 该肿么办?

假设有这么两个模块:

模块A:

import api from '~api'
  
const state = {
    vip: {},
}
  
const actions = {
    async ['get']({commit, state, dispatch}, config = {}) {
        try {
            const { data: { code, data } } = await api.post('vip/getVipBaseInfo', config)
            if (code === 1001) commit('receive', data)
        } catch(error) { console.log(error) }
    }
}
  
const mutations = {
    ['receive'](state, data) {
        state.vip = data
    }
}
  
const getters = {
    ['get'](state) {
        return state.vip
    },
}
  
export default {
    namespaced: true,
    state,
    actions,
    mutations,
    getters
}

模块B:

import api from '~api'
  
const state = {
    shop: {},
}
  
const actions = {
    async ['get']({commit, state, dispatch}, config = {}) {
        try {
            const { data: { code, data } } = await api.post('shop/getShopBaseInfo', config)
            if (code === 1001) commit('receive', data)
        } catch(error) { console.log(error) }
    }
}
  
const mutations = {
    ['receive'](state, data) {
        state.shop = data
    }
}
  
const getters = {
    ['get'](state) {
        return state.shop
    },
}
  
export default {
    namespaced: true,
    state,
    actions,
    mutations,
    getters
}

假设模块 B 的 actions 里, 需要用模块 A 的 state 该怎么办?

const actions = {
    async ['shop'](store, config = {}) {
        const { commit, dispatch, state, rootState } = store
        console.log(rootState) // 打印根 state
        console.log(rootState.vip) // 打印其他模块的 state
        try {
            const { data: { code, data } } = await api.post('shop/getShopBaseInfo', config)
            if (code === 1001) commit('receive', data)
        } catch(error) { console.log(error) }
    }
}

我们来看下上面的代码, actions 中的 shop 方法, 有 2 个参数, 第一个是 store, 第二个是 dispatch 调用时传过来的参数
store 这个对象又包含了 4 个键, 其中 commit 是调用 mutations 用的, dispatch 是调用 actions 用的, state 是当前模块的 state, 而 rootState 是根 state,
既然能拿到根 state, 想取其他模块的 state 是不是就很简单了…?

假设模块 B 的 actions 里, 需要调用模块 A 的 actions 该怎么办?

const actions = {
    async ['shop'](store, config = {}) {
        const { commit, dispatch, state, rootState } = store
        try {
            const { data: { code, data } } = await api.post('shop/getShopBaseInfo', config, 'get')
            if (code === 1001) commit('receive', data) // 调用当前模块的 mutations
            dispatch('vip/get', {}, {root: true}) // 调用其他模块的 actions
        } catch(error) { console.log(error) }
    }
}

上面的代码中commit(‘vip/receive’, {}, {root: true})就是在模块 B 调用 模块 A 的 mutations,
有 3 个参数, 第一个参数是其他模块的 mutations 路径, 第二个是传给 mutations 的数据, 如果不需要传数据, 也必须预留, 第三个参数是配置选项, 申明这个 mutations 不是当前模块的

假设模块 B 的 actions 里, 需要用模块 A 的 getters 该怎么办?

const actions = {
    async ['shop'](store, config = {}) {
        const { commit, dispatch, state, rootState, rootGetters } = store
        console.log(rootGetters['vip/get']) // 打印其他模块的 getters
        try {
            const { data: { code, data } } = await api.post('shop/getShopBaseInfo', config)
            if (code === 1001) commit('receive', data)
        } catch(error) { console.log(error) }
    }
}

我们来看下上面的代码, 相比之前的代码, store 又多了一个键: rootGetters
rootGetters 就是 vuex 中所有的 getters, 你可以用 rootGetters[‘xxxxx’] 来取其他模块的getters

相关文章:

  • 跨域问题解决方法: chrome浏览器关闭CORS策略
  • 前后端分离 webpack配置api代理
  • vue基础 笔记
  • 跨域情况下前端获取response header的问题
  • Python 生成二维码
  • Python 图片转字符画
  • CSS 一个炫酷的盒子效果
  • CSS 清除浮动
  • html+css课程综合案例
  • js 两个网页之间通过URL传输数据
  • css 选择器优先级的一道题
  • 面向对象和基于对象的区别
  • js 格式化日期
  • vue 动态路由刷新404问题
  • js 继承
  • 时间复杂度分析经典问题——最大子序列和
  • Elasticsearch 参考指南(升级前重新索引)
  • JavaScript类型识别
  • MYSQL 的 IF 函数
  • mysql 数据库四种事务隔离级别
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python socket服务器端、客户端传送信息
  • python大佬养成计划----difflib模块
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Twitter赢在开放,三年创造奇迹
  • 复杂数据处理
  • 记一次和乔布斯合作最难忘的经历
  • 理解在java “”i=i++;”所发生的事情
  • 实现菜单下拉伸展折叠效果demo
  • 我的zsh配置, 2019最新方案
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 运行时添加log4j2的appender
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​TypeScript都不会用,也敢说会前端?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (27)4.8 习题课
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core 中插件式开发实现
  • .NET gRPC 和RESTful简单对比
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net和jar包windows服务部署
  • .NET基础篇——反射的奥妙
  • @Transactional 竟也能解决分布式事务?
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [ACTF2020 新生赛]Upload 1
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [ccc3.0][数字钥匙] UWB配置和使用(二)