vuex中使用modules时遇到的坑及问题

目录
  • vuex使用modules时遇到的坑
  • vuex中modules基本用法
    • 1. store文件结构
    • 3. app.js文件内容
    • 5. 配置main.js

vuex使用modules时遇到的坑

其实也不算坑,只是自己没注意看官网api,定义module另外命名时,需要在module中加一个命名空间namespaced: true

属性,否则命名无法暴露出来,导致报[vuex] module namespace not found in mapState()等错误。

vuex中modules基本用法

1. store文件结构

- src
- components
- store
    -index.js
    -modules
        -app.js
        -bus.js

2.1 index.js中-手动引入modules

import Vue from 'vue'
import Vuex from 'vuex'
import bus from './module/bus'
import app from './module/app'
Vue.use(Vuex)
export default new Vuex.Store({
    state: {
        // 这里是根vuex状态
    },
    mutations: {
        // 这里是根vuex状态
    },
    actions: {
        // 这里是根vuex状态
    },
    modules: { // 子vuex状态模块注册
        namespaced: true, // 为了解决不同模块命名冲突的问题
        app,
        bus
    }
})

2.2 index.js中-动态引入modules

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const dynamicModules = {}
const files = require.context('.', true, /\.js$/)
const dynamicImportModules = (modules, file, splits, index = 0) => {
    if (index == 0 && splits[0] == 'modules') {
        ++index
    }
    if (splits.length == index + 1) {
        if ('index' == splits[index]) {
            modules[splits[index - 1]] = files(file).default
        } else {
            modules.modules[splits[index]] = files(file).default
        }
    } else {
        let tmpModules = {}
        if ('index' == splits[index + 1]) {
            tmpModules = modules
        } else {
            modules[splits[index]] = modules[splits[index]] ? modules[splits[index]] : {namespaced: true, modules: {}}
            tmpModules = modules[splits[index]]
        }
        dynamicImportModules(tmpModules, file, splits, ++index)
    }
}
files.keys().filter(file => file != './index.js').forEach(file => {
    let splits = file.replace(/(\.\/|\.js)/g, '').split('\/');
    dynamicImportModules(dynamicModules, file, splits)
})
export default new Vuex.Store({
    modules: dynamicModules,
    strict: process.env.NODE_ENV !== 'production'
})

3. app.js文件内容

const state = {
    user: {}, // 需要管理的状态数据
}
const mutations = {
    setUser (state, val) {
            state.user = val
        }
}
const getters = {}
const actions = {}
export default {
    namespaced: true,
    state,
    mutations,
    getters,
    actions
}

4.1 使用 a.vue页面

// 使用模块中的mutations、getters、actions时候,要加上模块名,例如使用commint执行mutations时
// 格式: 模块名/模块中的mutations
this.$store.commit("app/setUser", user)
// 获取属性时同样加上模块名
this.$store.state.app.user 

4.2 utils.js中使用

// 引入 这里的store 就相当于页面中的 this.$store
import store from '@/store'
export const setCurUser = (user) => {
    let curUser = store.app.user
    if(!curUser) {
        store.commit("app/setUser", user)
        return user
    }
    
    return curUser
}

5. 配置main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 深入理解vuex2.0 之 modules

    什么是module? 背景:在Vue中State使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理. module:可以让每一个模块拥有自己的state.mutation.action.getters,使得结构非常清晰,方便管理. 怎么用module? 一般结构 const moduleA = { state: { ... }, mutations: { ... }, actions: { ...

  • Vuex modules模式下mapState/mapMutations的操作实例

    当我们使用 Vuex 实现全局状态维护时,可能需要将状态值划分多个模块,比如一些 root 级的用户登录状态,token,用户级的用户信息,购物车级的购物车信息. 下面我们实例演示下如何在多模块下使用 mapState/mapMutations. modules 只作用于属性,属性会归属在相应的模块名的命名空间下. mutations, actions, getter 没有命名空间的限定,所以要保证全局的唯一性,否则后者会覆盖前者 store/index.js import Vue from '

  • vuex中Modules的使用详解

    目录 前言 1 .什么是模块Modules 2.模块内部参数问题 3.模块命名空间问题 (1)namespaced: true 使模块成为带命名空间的模块 (2)带命名空间的绑定函数的使用 4.模块动态注册 写在最后 前言 在Vue中State使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理.于是Vuex中就存在了另外一个核心概念 modules.本文就来总结 modules 相关知识点. 1 .

  • 详解vuex之store拆分即多模块状态管理(modules)篇

    了解vuex的朋友都知道它是vue用来集中管理状态的容器,如果了解过Reduce的朋友可能看见他时就会非常熟悉,都是用来管理全局的状态的,实现不同组件之间相互的数据访问.这里我们不介绍vuex,主要介绍vuex拆分store以及多模块管理.我们知道如果一个项目非常大的话状态就会非常的多,如果不进行分类处理,所有的状态都维护在一个state里面的话,状态管理就会变得非常的混乱,这样非常不利于项目的后期维护.我们现在前端推崇模块化开发,为的就是提高开发效率和维护效率,避免重复工作.那么vuex是怎么

  • vuex 如何动态引入 store modules

    目录 动态引入store modules 我的目录结构是 使用modules时遇到的坑 动态引入store modules 主要解决的问题每次建一个module需要自己去主index.js里面去注册 为了偷懒,也为了避免团队开发时同时对index.js 进行修改引发冲突 所以在index.js中 动态的对子目录和模块进行注册 我的目录结构是 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const dynamicModul

  • vuex中使用modules时遇到的坑及问题

    目录 vuex使用modules时遇到的坑 vuex中modules基本用法 1. store文件结构 3. app.js文件内容 5. 配置main.js vuex使用modules时遇到的坑 其实也不算坑,只是自己没注意看官网api,定义module另外命名时,需要在module中加一个命名空间namespaced: true 属性,否则命名无法暴露出来,导致报[vuex] module namespace not found in mapState()等错误. vuex中modules基本

  • 浅谈在django中使用filter()(即对QuerySet操作)时踩的坑

    代码伺候: 先看如下代码: 例1: message = Message.objects.filter(pk=message_id2) message[0].id = message_id2 message[0].content = content2 message[0].message_type = message_type2 print(message[0].id) print(message[0].content) message[0].save() 可正常从QuerySet中读取数据,并打

  • vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作

    vuex数据改变,组件中页面不渲染 相信许多vuex新手都会遇到这样的问题: vuex数据更新后,插件中使用数据的地方没有更新 这样的代码 data() { return { tableData: this.$store.state.AdminInfo }; } 然后在 template 中使用 tableData <el-table :data="tableData" class="tablePst"> <el-table-column labe

  • VueX mapGetters获取Modules中的Getters方式

    目录 VueX mapGetters获取Modules的Getters mapGetters的使用及简单实现原理 项目中的mapGetters mapGetters简单实现原理 VueX mapGetters获取Modules的Getters 注明 : permission 是你要获取的Modules中的哪一个 (permission 即是 模块名);         ...mapGetters("permission",[             'ReturnRoutes'    

  • vue3+ts+Vuex中使用websocket协议方式

    目录 vue3+ts+Vuex使用websocket协议 在stroe中 vue3中 vue封装websocket 封装的socket.js文件内容 使用方法 vue3+ts+Vuex使用websocket协议 本文作者使用的是ts+vue3的setup语法糖,大家注意使用的vue版本! 在stroe中 import { createStore } from 'vuex' import { stateInt } from '../interface/storeInterface' const s

  • vuex 中辅助函数mapGetters的基本用法详解

    mapGetters辅助函数 mapGetters辅助函数仅仅是将 store 中的 getter 映射到局部计算属性: 1.在组件或界面中不使用mapGetter调用映射vuex中的getter 1.1 调用映射根部store中的getter <!-- test.vue --> <template> <div class="vuexReponse"> <div @click="changeVal">点击</di

  • 解决vue页面刷新vuex中state数据丢失的问题

    页面刷新后,原有的 vuex 中的 state 会发生改变,如果在页面刷新之前,可以将 state 信息保存,页面重新加载时,再将该值赋给 state,那么该问题即可解决. 1.localstorage 可以使用 localstorage 来保存信息. [在某组件中添加如下钩子函数.比如 App.vue中] created() { //在页面加载时读取localStorage里的状态信息 if (localStorage.getItem("store") ) { this.$store

  • Vuex中状态管理器的使用详解

    目录 一.Vuex是什么? 二.什么时候使用Vuex 三.Vuex的核心概念和API 四.应用举例 五.vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex 一.Vuex是什么? Vuex在Vue项目开发时使用的状态管理工具.简单来说,就是对Vue的应用中多个组件的共享状态进行集中式的管理(读/写) Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取Sta

  • vue获取或者改变vuex中的值方式

    目录 vue获取或改变vuex的值 store–>index.js 在页面中使用或者修改vuex中的值 监听vuex值变化实时改变 问题如图 思路 vue获取或改变vuex的值 store–>index.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { isLogin:localStorage.getItem("isLogin&

随机推荐