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

vue 之 vuex

目录

vuex 是什么

Vuex管理哪些状态呢?

Vuex 页面刷新数据丢失怎么解决

1. 使用浏览器的本地存储

2. 使用 Vuex 持久化插件

3. 使用后端存储

注意事项

Vuex 为什么要分模块并且加命名空间


vuex 是什么

vuex 是专门为 vue 提供的全局状态管理系统,用于多个组件中数据共享、数据缓存等。(无法持久化、内部核心原理是通过创造一个全局实例 new Vue)

主要包括以下几个模块:

  • State:定义了应用状态的数据结构,可以在这里设置默认的初始状态。
  • Getter:允许组件从 Store 中获取数据,mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性。
  • Mutation:是唯一更改 store 中状态的方法,且必须是同步函数。
  • Action:用于提交 mutation,而不是直接变更状态,可以包含任意异步操作。
  • Module:允许将单一的 Store 拆分为多个 store 且同时保存在单一的状态树中。

Vuex管理哪些状态呢?

一般大型项目中会有多个状态,在多个界面间的共享问题。

  • 比如用户的登录状态、用户名称、头像、地理位置信息等等。
  • 比如商品的收藏、购物车中的物品等等。

这些状态信息,我们都可以放在统一的地方,对它进行保存和管理,而且它们还是响应式的。

Vuex 页面刷新数据丢失怎么解决

当 Vuex 中的数据在页面刷新后丢失时,这通常是因为 Vuex 的状态数据是保存在运行内存中的,页面刷新会导致 Vue 实例重新加载,进而 Vuex 中的数据被重置为初始状态。为了解决这个问题,可以采取以下几种方法:

1. 使用浏览器的本地存储
  • localStorage:数据会永久存储在浏览器中,除非被主动删除。
  • sessionStorage:数据存储在当前会话的 tab 页中,关闭当前 tab 页或浏览器窗口后数据会消失。
  • cookie:数据根据设置的有效时间存储,但通常不推荐用于存储大量数据,因为存在大小限制且不易读取。

解决方案:

在 Vuex 的 mutation 或 action 中,监听数据的变化,将数据同步到浏览器的本地存储中。
页面刷新时,从本地存储中读取数据并恢复到 Vuex 中。

2. 使用 Vuex 持久化插件

vuex-persistedstate:它就是为 Vuex 持久化存储而生的一个插件。不需要你手动存取 storage ,而是直接将状态保存至 cookie 或者 localStorage 中。

解决方案:

安装并引入vuex-persistedstate 插件
在创建 Vuex store 时,将插件添加到 plugins 数组中,并配置存储选项(如使用 localStorage 还是 sessionStorage)。

import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';Vue.use(Vuex);export default new Vuex.Store({state: {// ...},mutations: {// ...},actions: {// ...},plugins: [createPersistedState({storage: window.sessionStorage, // 或者 localStorage})]
});
3. 使用后端存储

如果数据量较大或需要多个设备之间共享数据,可以考虑将数据存储到后端服务器中。

解决方案:

在 Vuex 的 action 中,使用 Ajax、Fetch API 等技术将数据发送到后端服务器进行存储。
页面刷新时,从后端服务器重新获取数据并恢复到 Vuex 中。

注意事项
  • 对于敏感信息(如用户登录信息),不应直接存储在浏览器的本地存储中,而应采用更安全的方式来保存。
  • 使用本地存储或插件时,要注意防止数据的被篡改或泄露等安全问题。
  • 根据应用的具体需求和场景,选择最适合的解决方案。例如,对于小型应用或数据量不大的情况,使用浏览器的本地存储可能是一个简单有效的选择;而对于大型应用或需要复杂数据管理的情况,使用后端存储可能更为合适。

Vuex 为什么要分模块并且加命名空间

模块: 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。

命名空间:默认情况下,模块内部的 action、mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应。如果希望使模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。这样,即使有多个模块,也不会造成状态全局污染的问题。

相关文章:

  • HTML(6)——表单
  • 重装了mysql,然后安装为服务时,net start 启动一直报错,MySQL服务无法启动的解决
  • Streamlit 与 Gradio:Python 仪表板的终极对决
  • 智能体(Agent)实战——从gpts到auto gen
  • Postman接口测试/接口自动化实战教程
  • 【STC8A8K64D4开发板】第3-1讲:温度传感器DS18B20
  • 使用python绘制三维直方图
  • 面向对象编程基本概念
  • opengauss安装postgis插件(Docker部署)
  • GPU性能相关的工具
  • 多态深度剖析
  • 算法day26
  • spring boot jwt 实现用户登录完整java
  • 如何用 JavaScript 下载文件
  • C#版 iText7——画发票PDF(完整)
  • 【译】JS基础算法脚本:字符串结尾
  • Angular4 模板式表单用法以及验证
  • bootstrap创建登录注册页面
  • codis proxy处理流程
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Django 博客开发教程 8 - 博客文章详情页
  • EventListener原理
  • HTTP中GET与POST的区别 99%的错误认识
  • java概述
  • js中的正则表达式入门
  • mysql innodb 索引使用指南
  • MySQL数据库运维之数据恢复
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • react-native 安卓真机环境搭建
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 开源地图数据可视化库——mapnik
  • 两列自适应布局方案整理
  • 聊聊flink的BlobWriter
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 阿里云ACE认证学习知识点梳理
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (八)Spring源码解析:Spring MVC
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (七)c52学习之旅-中断
  • (七)Knockout 创建自定义绑定
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十一)手动添加用户和文件的特殊权限
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net实现头像缩放截取功能 -----转载自accp教程网