Vuex状态、数据持久化(vue2、vue3状态数据持久化)

**简介:**Vuex是一个仓库,是vue的状态管理工具,存放公共数据,任何组件都可以使用vuex里的公共数据。Vuex提供了插件系统,允许我们使用 vuex-persistedstate插件,将Vuex的状态持久化到本地存储中,解决页面刷新或重新打开应用时状态丢失的问题;这里记录一下Vuex数据持久化的几种实现方案。

⭐这里先介绍一下Vuex里面属性及使用

1、属性介绍

javascript 复制代码
 //1、state存放状态和数据
 state: {
    flag: 0,
  },

  //2、mutations修改状态和数据
  mutations: {
    defineTest(state, i) {
      state.flag = i;
    }
  },

  //3、getters计算属性
  getters: {
  },

  //4、actions异步操作
  actions: {
  },

  //5、modules模块化
  modules: {
  },

  //6、持久化插件
  plugins: [
     vuexPersistedState({
       storage: window.localStorage, // 指定存储引擎  
     }),
  ],

2、页面调用

javascript 复制代码
 //state的调用方式 1
 computed: {  
    ...mapState(['flag']) // 将 this.$store.state.count 映射为组件内的 count 计算属性  
 },
 <div>{{ flag }}</div>   
 
 //state的调用方式 2
 <div v-if="this.$store.state.flag">测试数据</div>


 //mutations的调用方式 1
 methods: {  
   // 将 this.increment() 映射为this.$store.commit('increment')      
   ...mapMutations(['increment']),  
   // 触发事件
   this.increment();
 }  
 
 //mutations的调用方式 2
 this.$store.commit('defineTest', i)

⭐Vue2中,Vuex状态、数据持久化

一、通过手写函数和plugins,实现状态、数据持久化话;

1、新建pluginPersist.js文件,并导出存储函数

javascript 复制代码
/**
 * 
 * @param {状态、数据持久化} store 
 */
export default function (store) {
    // console.log(store);
    // 存
    const KEY = 'VUEX:STATE';
    //这里表示 页面关闭 或 刷新 时存储
    window.addEventListener("beforeunload", () => {
        localStorage.setItem(KEY, JSON.stringify(store.state))
    })
    // 取
    try {
        const state = JSON.parse(localStorage.getItem(KEY));
        if (state) {
            store.replaceState(state);
        }
    } catch (err) {
        console.log(err);
    }
}

2、在store中,在plugins里引入挂载使用;plugins插件中的函数会在创建仓库时执行,插件的本质就是一个函数

javascript 复制代码
import Vue from 'vue'
import Vuex from 'vuex'
import pluginPersist from "./pluginPersist"

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {  
    // ...状态、数据 
  },  
  mutations: {  
    // ...修改状态、数据
  },  
  actions: {  
    // ...动作函数 
  },  
  getters: {  
    // ...计算属性
  },  
  modules: {
    // ...模块化
  },
    //这里使用
  plugins: [pluginPersist],
 
})

export default store;

二、通过手写db对象方法,实现数据、状态持久化;

1、新建localStorage.js文件,创建db对象,然后导出db方法

javascript 复制代码
var localStorage = window.localStorage;
const db = {
    /** 
     * 更新状态 
     */
    save(key, value) {
        // console.log(key, value);
        // 页面关闭或刷新时存储
        // window.addEventListener("beforeunload", () => {
        //     localStorage.setItem(key, JSON.stringify(value))
        // })
        // 触发该事件时存储 二选一
        localStorage.setItem(key, JSON.stringify(value));
    },
    /** 
     * 获取状态,如果有状态值,获取最新状态值;如果没有,获取默认值 
     */
    get(key, getSaveVal = null) {
        // console.log(key, getSaveVal);
        try {
            return JSON.parse(localStorage.getItem(key)) || getSaveVal;
        } catch (err) {
            console.log(err);
        }
    },
    /** 
     * 移除状态 
     */
    remove(key) {
        // console.log(key);
        localStorage.removeItem(key);
    },
    /** 
     * 清空状态 
     */
    clear() {
        localStorage.clear();
    }
};
export default db;

2、在store中引入使用

javascript 复制代码
import Vue from 'vue'
import Vuex from 'vuex'
import db from './localStorage';

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    // 初始化时 默认获取
    state1: db.get('STATE1') || null,
  },
  mutations: {
    SET_STATE1: (state, value) => {
      state.state1++
      //调用SET_STATE1方法时 这里存储
      db.save('STATE1', state.state1);
    },
  },
  actions: {  
    // 动作函数 
  },  
  getters: {  
    // 计算属性
  },  
  modules: {
    // 模块化
  },
    // 插件
  plugins: [],

})

export default store

3、组件中调用SET_STATE1方法,并传值data

javascript 复制代码
methods: {
    choseBtn(){
      this.$store.commit("SAVE_DOTS", this.data);
    }
},

三、通过vue插件vuex-persistedstate 或 vuex-plugin-persistedstate实现数据、状态持久化;

1、安装依赖

css 复制代码
npm install vuex-persistedstate --save  
//或者  
cnpm install vuex-persistedstate --save 
//或者
yarn add vuex-persistedstate

--save是安装在生产环境,开发和生产都需要用到

//查看插件的依赖项
npm ls vuex-persistedstate

Tips:vuex-persistedstate 和 vuex-plugin-persistedstate 是同一个插件的不同引用方式,它们都是用来持久化 Vuex 状态管理的插件,可以将 Vuex 中的状态保存到本地存储(如 localStorage 或 sessionStorage)中,以便在刷新页面或重新打开应用时恢复这些状态;persist目前已经弃用;

2、引入使用

javascript 复制代码
import Vue from 'vue';  
import Vuex from 'vuex';  
import createPersistedState from 'vuex-persistedstate';  
  
Vue.use(Vuex);  
  
export default new Vuex.Store({  
  state: {  
    // ...你的状态定义  
  },  
  mutations: {  
    // ...你的变更函数定义  
  },  
  actions: {  
    // ...你的动作函数定义  
  },  
  getters: {  
    // ...你的计算属性定义  
  },  
  modules: {
    // ...模块化
  },
  plugins: [  
    createPersistedState({  
      storage: window.localStorage, // 或者使用 sessionStorage  
    }),  
  ],  
});

3、注意事项:

createPersistedState 函数创建了一个插件实例;

可以将存储选项(如 localStorage 或 sessionStorage)作为参数传递给它,插件默认使用 localStorage,但是可以根据需要选择其他存储方式;

vuex-persistedstate 插件默认会持久化 Vuex 中的所有状态,如果你只想持久化部分状态,可以通过配置插件的 paths 选项来实现

javascript 复制代码
createPersistedState({  
  storage: window.localStorage,  
  // 只持久化这些路径下的状态  
  paths: ['some', 'partial', 'state'] 
})

在上面的配置中,只有 state.some/partial/state 路径下的状态会被持久化;其它状态在页面刷新或重新加载时不会得到恢复。

⭐Vue3中,Vuex状态、数据持久化

Vue3中的数据、状态持久化,可以通过Pinia插件实现,是vue3官方指定的持久化实现方案,地址在这:

Pinia官网https://pinia.vuejs.org/zh/

相关推荐
放逐者-保持本心,方可放逐1 分钟前
XSS 与 CSRF 记录
前端·xss·csrf·浏览器安全
徊忆羽菲1 分钟前
利用HTML5和CSS来实现一个漂亮的表格样式
前端·css·html5
不爱说话郭德纲7 分钟前
Stylus、Less 和 Sass 的使用与区别
前端·css·面试·less·sass·stylus
凄凄迷人16 分钟前
如何调试 chrome 崩溃日志(MAC)
前端·chrome·macos·crash
蒙特网站20 分钟前
网站布局编辑器前端开发:设计要点与关键考量
前端·javascript·学习·html
理想不理想v23 分钟前
前端开发工程师需要学什么?
java·前端·vue.js·webpack·node.js
fhf36 分钟前
感觉根本等不到35岁AI就把我裁了
前端·人工智能·程序员
hummhumm37 分钟前
第 36 章 - Go语言 服务网格
java·运维·前端·后端·python·golang·java-ee
曲邹萌1 小时前
springboot-vue excel上传导出
vue.js·spring boot·导入导出
蒜蓉大猩猩1 小时前
Vue.js - 组件化编程
开发语言·前端·javascript·vue.js·前端框架·ecmascript