Vuex常用模块化使用方案

本文介绍Vue项目中如何利用Vuex进行模块化的状态管理,包括目录结构搭建、store配置及组件内使用等关键步骤。

Vue中进行数据的统一状态管理,无疑Vuex是最好的选择。那么我又不想把所有的state全扔到一个文件里面进行管理,而是要进行友好的拆分,模块化管理。
Vuex的官网上当然介绍了module(模块化分割)的使用,下面简要概述项目中使用vuex的常见模块管理。

目录结构:

--store
        --moduleA
               --types.js
               --mutations.js
               --actions.js
        --moduleB
               --types.js
               --mutations.js
               --actions.js
        --store.js

由外及内来实现一下
1.vue的main.js导入store,全局可用this.$store
javascript 代码

import store from './store/store';
new Vue({
  el: '#app',
  router,
  store,
  template: '<App/>',
  components: { App }
})

2.store.js具体实现一个store
javascript 代码

import Vue from 'vue';
import Vuex from 'vuex';
import moduleA from './moduleA/mutations';
import moduleB from './moduleB/mutations';
Vue.use(Vuex);

export default new Vuex.Store({
    modules: {
        a: moduleA,
        b: moduleB
    }
});

3.moduleA的具体代码
1) types.js
javascript 代码

export const CHANGE_COUNTA = 'CHANGE_COUNTA';

2) actions.js
javascript 代码

import * as types from './types';

export default {
    changeCountA({commit}, num) {
        commit(types.CHANGE_COUNTA, num);
    }
}

3) mutations.js
javascript 代码

import {
    CHANGE_COUNTA
} from './types'
import actions from './actions';

const state = {
    countA: 0
}

const mutations = {
    [CHANGE_COUNTA](state, num) {
        state.countA = num;
    }
}

const getters = {
    getCountA(state) {
        return state.countA;
    }
}

export default {
    state,
    mutations,
    getters,
    actions
}

moduleB同样如此

4.view层组件使用
html 代码

<template>
    {{this.getCountA}}
    <button @click="handleDisplach">click</button>
</template>

<script>
     import {mapGetters} from 'vuex';
     export default {
        data () {
            return {

            }
        },
        computed: {
            ...mapGetters([
                'getCountA'
            ])
        },
        methods: {
            handleDisplach() {
                console.log(this.$store);
                this.$store.dispatch('changeCountA', 1);
            }
        }
    }
</script>

5.还有其他的辅助函数具体见官网

<think> 我们正在讨论Vuex持久化,这是一个在Vue.js应用中保持状态持久的技术。用户之前询问了vueX持久化的实现方法和工具,因此我们需要提供相关的信息。 根据要求,我们将使用中文回答,并在适当的地方使用LaTeX格式(虽然这个主题可能较少用到数学公式,但如果有需要我们会使用)。同时,我们需要在回答末尾生成相关问题。 实现Vuex持久化的常见方法: 1. 使用浏览器本地存储(如localStorage或sessionStorage) 2. 使用第三方库(如vuex-persistedstate、vuex-persist) 下面我们将详细说明。 方法一:使用浏览器本地存储 这种方法的核心思路是在Vuex的状态发生变化时,将状态保存到本地存储中(如localStorage),并在页面加载时从本地存储中读取状态并替换Vuex的初始状态。 示例代码: ```javascript // 在创建store实例之前,尝试从localStorage中读取状态 const store = new Vuex.Store({ // ...其他配置 state: { // 初始状态,尝试从localStorage中获取 count: localStorage.getItem('count') ? parseInt(localStorage.getItem('count')) : 0 }, mutations: { increment(state) { state.count++; // 每次变化后保存到localStorage localStorage.setItem('count', state.count); } } }); ``` 上述方法简单,但需要手动处理每个状态的持久化,且在状态结构复杂时比较繁琐。 方法二:使用第三方库 推荐使用专门为Vuex设计的持久化库,例如`vuex-persistedstate`或`vuex-persist`。 1. vuex-persistedstate 安装: ```bash npm install --save vuex-persistedstate ``` 使用: ```javascript import createPersistedState from "vuex-persistedstate"; import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ // ...其他配置 plugins: [createPersistedState()], }); ``` 默认情况下,它会将整个Vuex状态保存到localStorage中,并在页面刷新后自动恢复。 可以配置项包括: - key: 存储的键名(默认为'vuex') - storage: 可以指定为window.sessionStorage等 - reducer: 选择需要持久化的部分状态 - 等等 示例:只持久化部分状态 ```javascript plugins: [ createPersistedState({ key: 'my-app-vuex', storage: window.sessionStorage, reducer: (state) => { return { // 只保存state中的user模块 user: state.user }; } }) ] ``` 2. vuex-persist 另一个流行的库是`vuex-persist`,它功能类似,但支持TypeScript。 安装: ```bash npm install vuex-persist ``` 使用: ```javascript import VuexPersistence from 'vuex-persist'; const vuexLocal = new VuexPersistence({ storage: window.localStorage }); const store = new Vuex.Store({ // ...state, mutations, actions等 plugins: [vuexLocal.plugin] }); ``` 除了以上两种,还有其他一些库如`vuex-persist`、`vuex-localstorage`等,但前两者是最常用的。 注意事项: - 本地存储(如localStorage)有大小限制(通常5MB),且只能存储字符串。因此,这些库内部会使用JSON.stringify和JSON.parse进行序列化和反序列化。 - 敏感信息(如用户密码、token等)不建议保存在localStorage中,因为容易受到XSS攻击。可以考虑存储在sessionStorage中,或者使用cookie并设置httpOnly。 相关工具总结: - vuex-persistedstate: 简单易用,文档清晰,支持自定义存储、序列化方法等。 - vuex-persist: 支持TypeScript,功能类似,但API略有不同。 根据项目需求选择合适的工具。 §§相关问题§§ 1. Vuex持久化时如何处理状态中的复杂对象(如日期对象)? 2. 在Vuex持久化中,如何避免存储敏感信息? 3. 除了localStorage和sessionStorage,还有哪些存储方式可用于Vuex持久化? 4. 如何实现Vuex持久化的加密存储? </think> ### Vuex持久化的实现方法与相关工具 Vuex持久化是指将Vuex的状态数据保存到浏览器本地存储(如localStorage或sessionStorage),在页面刷新后自动恢复状态的技术。以下是具体实现方法和推荐工具: #### 一、原生实现方法 1. **手动保存/恢复状态** 使用`localStorage`或`sessionStorage`实现基础持久化: ```javascript // 初始化时读取存储 const savedState = localStorage.getItem('vuex-state'); const store = new Vuex.Store({ state: savedState ? JSON.parse(savedState) : initialState, mutations: { updateData(state, payload) { state.data = payload; // 每次变更后保存 localStorage.setItem('vuex-state', JSON.stringify(state)); } } }); // 页面刷新前保存状态 window.addEventListener('beforeunload', () => { localStorage.setItem('vuex-state', JSON.stringify(store.state)); }); ``` **优点**:无需依赖第三方库 **缺点**:需手动维护状态同步 2. **Vuex插件实现** 创建自定义插件自动处理持久化: ```javascript const persistencePlugin = store => { // 初始化恢复 const savedState = localStorage.getItem('vuex-state'); if (savedState) store.replaceState(JSON.parse(savedState)); // 订阅mutation store.subscribe((mutation, state) => { localStorage.setItem('vuex-state', JSON.stringify(state)); }); }; ``` 在Vuex初始化时加载: ```javascript const store = new Vuex.Store({ plugins: [persistencePlugin] }); ``` #### 二、推荐工具库 1. **vuex-persistedstate(最流行)** ```bash npm install vuex-persistedstate ``` 基础使用: ```javascript import createPersistedState from 'vuex-persistedstate' const store = new Vuex.Store({ plugins: [createPersistedState()] }); ``` **高级配置**: ```javascript createPersistedState({ key: 'my-app-vuex', // 存储键名(默认:vuex) storage: window.sessionStorage, // 切换session存储 reducer: state => ({ // 选择性持久化 user: state.user, settings: state.settings }), paths: ['auth.token'] // 支持路径语法 }) ``` 2. **vuex-persist** ```bash npm install vuex-persist ``` 特性示例: ```javascript import VuexPersistence from 'vuex-persist' const vuexLocal = new VuexPersistence({ storage: window.localStorage, asyncStorage: true, // 支持异步存储 modules: ['userModule'] // 模块级持久化 }) const store = new Vuex.Store({ plugins: [vuexLocal.plugin] }); ``` 3. **vuex-localstorage(轻量级)** 适用于简单场景: ```javascript import createPersist from 'vuex-localstorage' const store = new Vuex.Store({ plugins: [createPersist({ namespace: 'myapp' })] }); ``` #### 三、最佳实践建议 1. **数据安全** - 敏感数据(如token)建议存储在`sessionStorage`中 - 使用加密库(如`crypto-js`)加密敏感字段 ```javascript createPersistedState({ setState: (key, state) => localStorage.setItem(key, encrypt(state)), getState: key => decrypt(localStorage.getItem(key)) }) ``` 2. **性能优化** - 对大对象使用`reducer`过滤非必要字段 - 避免频繁写入:添加防抖逻辑 ```javascript subscribe: (handler) => store.subscribe(debounce(handler, 1000)) ``` 3. **SSR兼容** 在Nuxt.js中使用: ```javascript export default ({ store }) => { createPersistedState({ storage: { getItem: key => process.client ? localStorage.getItem(key) : null, setItem: (key, value) => process.client && localStorage.setItem(key, value), removeItem: key => process.client && localStorage.removeItem(key) } })(store) } ``` #### 四、适用场景对比 | **场景** | **推荐方案** | |------------------------|---------------------------| | 简易项目 | 原生localStorage实现 | | 常规SPA应用 | vuex-persistedstate | | TypeScript项目 | vuex-persist | | 需要加密数据 | 自定义插件 + crypto-js | | 模块化按需持久化 | vuex-persist的modules配置 | > **注意**:浏览器存储限制通常为5MB,超大数据建议配合IndexedDB使用(如`vuex-persist`+`localForage`方案)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RI Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值