vuex的工作流程,模块化使用案例分享,及状态持久化

文章目录

      • 一、Vuex 是什么?
      • 二、核心概念
      • 三、Vuex 的工作流程
      • 四、什么情况下我应该使用 Vuex?
      • 五、Vuex 的使用
      • 六、使用示例
      • 七、状态持久化
        • 1、手动利用HTML5的本地存储
        • 2、利用vuex-persistedstate插件
          • 2.1、安装
          • 2.2、配置

一、Vuex 是什么?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方生态系统中,并且在开发大型、复杂单页应用(SPA)时尤其有用。

二、核心概念

  • state:定义应用程序状态的数据。(数据,类似data)

  • mutations:用于修改状态的方法。(执行,类似methods)

  • actions:用于触发 mutations 的方法。(事件,类似controller)

  • getters:用于获取 state 中的数据。(数据加工,类似computed)

  • modules:使用单一状态树,致使应用的全部状态集中到一个很大的对象,所以把每个模块的局部状态分装使每一个模块拥有本身的 state、mutation、action、getters、甚至是嵌套子模块;

三、Vuex 的工作流程

  • 通过dispatch去提交一个actions,

  • actions接收到这个事件之后,在actions中可以执行一些异步|同步操作,根据不同的情况去分发给不同的mutations,

  • actions通过commit去触发mutations,

  • mutations去更新state数据,

  • state更新之后,就会通知vue进行渲染

四、什么情况下我应该使用 Vuex?

Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡。

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式 (opens new window)就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

五、Vuex 的使用

  • 定义 state:定义应用程序的状态数据。

  • 定义 mutations:定义修改 state 的方法。

  • 定义 actions:定义触发 mutations 的方法,可以包含异步操作。

  • 定义 getters:定义获取 state 中数据的方法。

  • 创建 store:将 state、mutations、actions、getters 组合成一个 store 对象。

  • 在应用程序中使用 store:在应用程序中使用 store 对象的 state、mutations、actions、getters。

Vuex 并不限制你的代码结构。但是,它规定了一些需要遵守的规则:

  • 应用层级的状态应该集中到单个 store 对象中。

  • 提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。

  • 异步逻辑都应该封装到 action 里面。

只要你遵守以上规则,如何组织代码随你便。如果你的 store 文件太大,只需将 action、mutation 和 getter 分割到单独的文件。

对于大型应用,我们会希望把 Vuex 相关代码分割到模块中。

六、使用示例

以购物车为例,介绍vuex的使用全过程。

// vuex的入口文件,封装了cart模块,直接引入使用
// store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import cart from './cart'
Vue.use(Vuex)
export default new Vuex.Store({modules: {cart}
})

// cart模块的首页,引入了getters,actions,mutations
// 以及state中模拟的数据
// store/cart/index.js

import getters from "./getters"
import actions from "./actions"
import mutations from "./mutations"export default {state:{goods: [{id:1,name:'小米手机',price: 2000,count: 0,},{id:2,name:'苹果手机',price: 3000,count: 0,},{id:3,name:'华为手机',price: 4000,count: 0,}],},getters,actions,mutations
}

// getters文件,计算购物车的总价及数量
// store/cart/getters.js

export default {totalPrice(state){return state.goods.reduce((total,item)=>{total += item.price * item.countreturn total},0).toFixed(2)},count(state){return state.goods.reduce((total,item)=>{total += item.countreturn total},0)}
}

// actions文件,用于提交商品数量的变化
// store/cart/actions.js

export default {add({commit},payload){commit('add',payload)},reduce({commit},payload){commit('reduce',payload)}
}

// mutations文件,用于改变state中商品的数量变化
// store/cart/mutations.js

export default {add(state,index){state.goods[index].count++},reduce(state,index){if(state.goods[index].count>=1){state.goods[index].count--}},
}

// 这里是使用vuex的页面,展示购物车页面
// app.vue

<template><div class="about"><div v-for="(item, index) in goods" :key="index"><div>{{ item.name }}</div><div>{{ item.price }}</div><div style="display: flex"><button @click="reduce(index)">-</button><div>{{ item.count }}</div><button @click="add(index)">+</button></div></div><div style="display: flex;"><div>总计:{{ count }}</div><div>结算:{{ totalPrice }}</div></div></div>
</template><script>
import { mapGetters,mapState } from 'vuex'
export default {computed: {...mapState({goods(state) {return state.cart.goods},}),...mapGetters(['count', 'totalPrice'])},methods: {add(index) {this.$store.dispatch('add', index)},reduce(index) {this.$store.dispatch('reduce', index)}}
}
</script>

七、状态持久化

vuex优势: 相比sessionStorage,存储数据更安全,sessionStorage可以在控制台被看到。

vuex劣势: 在F5刷新页面后,vuex会重新更新state,所以,存储的数据会丢失。(即刷新浏览器,vuex数据丢失)

1、手动利用HTML5的本地存储

vuex的state在localStorage或sessionStorage或其它存储方式中取值 在mutations定义的方法里对vuex的状态操作的同时对存储也做对应的操作。这样state就会和存储一起存在并且与vuex同步

2、利用vuex-persistedstate插件
2.1、安装
npm install vuex-persistedstate
2.2、配置
  • vuex-persistedstate默认存储于localStorage
// 在store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';Vue.use(Vuex);export default new Vuex.Store({// ...plugins: [createPersistedState()]// ...
});
  • 存储sessionStorage的情况
plugins: [createPersistedState({storage: window.sessionStorage})]
  • 存储cookie的情况
import Cookies from 'js-cookie'plugins: [persistedState({storage: {getItem: key => Cookies.get(key),setItem: (key, value) => Cookies.set(key, value, { expires: 7 }),removeItem: key => Cookies.remove(key)}})]
  • 指定需要持久化的state

在vuex-persistedstate中,如果你想要指定需要持久化的state(即只持久化Vuex store中的部分状态,而不是全部),你可以通过paths配置选项来实现。paths是一个数组,其中的每个元素都是一个字符串,表示Vuex store中需要被持久化的状态的路径。

import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'
import cart from './cart'
import user from './user'
Vue.use(Vuex)
export default new Vuex.Store({plugins: [createPersistedState({paths:['cart','userSettings','user.name'] // 持久化'cart'模块的全部状态// 持久化全局状态中的'userSettings'// 只持久化'user'模块中的'name' })],state: {  // 你的全局状态  token: '',  userSettings: {  theme: 'dark',  notifications: true  }  },  // 你的模块  modules: {cart,user}
})
  • 过滤需要持久化的state

在vuex-persistedstate中,reducer是一个可选的配置项,它的作用是对即将被持久化到存储(如localStorage或sessionStorage)中的Vuex状态进行过滤或转换。通过使用reducer,你可以控制哪些数据被保存,以及如何保存这些数据,从而实现更细粒度的状态持久化控制。

reducer通常是一个函数,它接收当前的state(或特定部分的state,取决于你的配置)作为参数,并返回一个新的对象,该对象包含了应该被持久化的数据。


plugins: [createPersistedState({storage: window.sessionStorage,reducer(state) {  // 只返回需要被持久化的部分state  return {  // 假设我们只想持久化user模块中的name和avatar字段  user: {  name: state.user.name,  avatar: state.user.avatar  }  };  }})]

如果path和reducer同时存在则使用reducer, 忽悠paths属性。

  • API 配置

createPersistedState([options])使用给定的选项创建插件的新实例。可以提供以下选项来配置您的特定需求的插件:

API参数类型说明默认值
keyString用于存储持久状态的键。vuex
pathsArray部分保持状态的任何路径的数组。如果没有给定路径,则完整状态将持久化。如果给定一个空数组,则不会持久化任何状态。如果使用模块,请包括模块名称。[]
reducerFunction一个将被调用的函数,对即将被持久化到存储中的Vuex状态进行过滤或转换。都包含这些值
subscriberFunction被调用以设置突变订阅的函数。store => handler => store.subscribe(handler)
storageString指定存储数据的方式。localStorage
getStateFunction用来重新补充先前持久状态的功能。storage
setStateFunction用以保持给定状态的函数。storage
filterFunction一个将被调用以过滤setState最终将在存储中筛选过滤的函数。() => true

注意,getState 和 setState 是高级选项,它们允许你完全控制状态的存储和恢复过程。然而,在大多数情况下,简单地使用 paths 或默认行为可能就足够了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C++]类的自动转换和强制类型转换

在C中&#xff0c;类的自动转换&#xff08;也称为隐式转换&#xff09;和强制类型转换&#xff08;显式转换&#xff09;是面向对象编程中处理类型之间转换的两种重要机制。这些转换允许程序员定义如何在不同类型&#xff08;特别是自定义类型&#xff09;之间安全地交换数据。…

USART串口理论知识总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 USART串口理论知识总结 1、通讯的串行和并行1.串口采用发送数据代码并用printf重代码 1、通讯的串行和并行 1.串口采用发送数据代码并用printf重代码 #include <stdint.h…

Reator模型

文章目录 概述Reacotr模型&#xff1a;定义特点三个重要组件具体流程Reactor优点应用场景 代码片段 小结 概述 Reactor模型是一种设计模式&#xff0c;主要用于处理并发的I/O事件&#xff0c;特别是在网络编程和服务器设计中。 Reacotr模型&#xff1a; 定义 Reactor模式是…

GPT-4o mini 时代:开发者的机遇、挑战与经验共享

在当今科技飞速发展的时代&#xff0c;OpenAI 最新发布的 GPT-4o mini 模型以其卓越的性能和极具竞争力的价格&#xff0c;在技术领域掀起了一股热潮&#xff0c;引发了广泛的关注。对于广大开发者来说&#xff0c;这无疑是一个令人振奋的新契机。 GPT-4o mini 模型的诞生&…

【C++】流插入和流提取运算符重载

目录 前言ostream和istream自定义类型的流插入重载自定义类型的流提取重载解决私有问题日期类总接口 前言 我们在上一节实现日期类时&#xff0c;在输入和输出打印时&#xff0c;经常会调用两个函数&#xff1a; void Insert()//输入函数{cin >> _year;cin >> _mo…

Gson使用TypeAdapterFactory和TypeAdapter实现Json中的Key统一修改

Gson使用TypeAdapterFactory和TypeAdapter实现Json中的Key统一修改&#xff0c;增加前后缀 package com.pl.zorro.ConverterFactory;import static com.google.gson.stream.JsonToken.BEGIN_OBJECT;import androidx.annotation.NonNull;import com.google.gson.Gson; import co…

放眼全局做好真正的IT系统架构

一、系统架构存在的问题 当再次复盘业务架构、应用架构、技术架构、数据架构时这些过程域时&#xff0c;发现公司的这些架构如同一盘散沙。 1、业务架构随意&#xff0c;想到什么做什么&#xff0c;想法一天一个&#xff0c;天马行空。要么就是信息不对称&#xff0c;不统一。…

【Java】/* 浅谈String(下) */

目录 一、字符串的不可变性 二、字符串的修改 三、StringBuilder和StringBuffer 四、面试题 一、字符串的不可变性 1. 如上图所示&#xff0c;String类的是被final修饰的类(不能被继承)&#xff0c;成员变量value值是一个被final修饰的字节型数组。 2. 以下图代码为例&…

JavaWeb笔记_Session

Session概述 Session是一种在服务端记录用户会话信息的技术 Session的创建和获取 /*** HttpServletRequest对象中的方法:* public HttpSession getSession()* 如果当前服务端没有session,那就在服务端新建一个session对象* 如果在服务端有这个session,那么就直…

Java企业微信服务商代开发获取AccessToken示例

这里主要针对的是企业微信服务商代开发模式 文档地址 可以看到里面大致有三种token&#xff0c;一个是服务商的token&#xff0c;一个是企业授权token&#xff0c;还有一个是应用的token 这里面主要有下面几个参数 首先是服务商的 corpid 和 provider_secret &#xff0c;这个可…

C中字符串处理学习笔记

C中字符串处理学习笔记 目录 C中字符串处理学习笔记1. 字符串长度相关函数1.1 strlen函数1.2 strnlen函数 2. 字符串复制、设置相关函数2.1 strcpy函数2.2 strncpy函数2.3 strlcpy函数2.4 strcat函数2.5 strncat函数2.6 strlcat函数2.7 sprintf函数2.8 snprintf函数2.9 asprint…

mysql常用函数五大类

mysql常用函数 1. 第一类&#xff1a;数值函数1.1 圆周率pi的值1.2 求绝对值1.3 返回数字的符号1.4 开平方&#xff0c;根号1.5 求两个数的余数1.6 截取正数部分1.7 向上取整数1.8 向下取整数1.9 四舍五入函数1.10 随机数函数1.11 数值左边补位函数1.12 数值右边补位函数1.13 次…

83. UE5 RPG 实现属性值的设置

在前面&#xff0c;我们实现了角色升级相关的功能&#xff0c;在PlayerState上记录了角色的等级和经验值&#xff0c;并在变动时&#xff0c;通过委托广播的形式向外广播&#xff0c;然后在UI上&#xff0c;通过监听委托的变动&#xff0c;进行修改等级和经验值。 在这一篇里&a…

鸿蒙开发仓颉语言【Hyperion: 一个支持自定义编解码器的TCP通信框架】组件

Hyperion: 一个支持自定义编解码器的TCP通信框架 特性 支持自定义编解码器高效的ByteBuffer实现&#xff0c;降低请求处理过程中数据拷贝自带连接池支持&#xff0c;支持连接重建、连接空闲超时易于扩展&#xff0c;可以积木式添加IoFilter处理入栈、出栈消息 组件 hyperio…

Mongodb的通配符索引

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第95篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

代理IP协议是一种网络代理技术&#xff0c;可以实现隐藏客户端IP地址、加速网站访问、过滤网络内容、访问内网资源等功能。常用的IP代理协议主要有Socks5代理、HTTP代理、HTTPS代理这三种。代理IP协议主要用于分组交换计算机通信网络的互联系统中使用&#xff0c;只负责数据的路…

python-基础篇-字符串-是什么

文章目录 定义一&#xff1a;所谓字符串&#xff0c;就是由零个或多个字符组成的有限序列&#xff0c;在Python程序中&#xff0c;如果我们把单个或多个字符用单引号或者双引号包围起来&#xff0c;就可以表示一个字符串。字符串和常用数据结构使用字符串 通过多个角度的定义了…

开局一个启动器:从零开始入坑ComfyUI

前几天刷某乎的时候看到了一位大佬写的好文&#xff0c;可图 IP-Adapter 模型已开源&#xff0c;更多玩法&#xff0c;更强生态&#xff01; - 知乎 (zhihu.com) 久闻ComfyUI大名&#xff0c;决定试一下。这次打算不走寻常路&#xff0c;不下载现成的一键包了&#xff0c;而是…

let、var、const 的区别 --js面试题

作用域 ES5中的作用域有&#xff1a;全局作用域、函数作用域&#xff0c;ES6中新增了块级作用域。块作用域由 { } 包括&#xff0c;if 语句和 for 语句里面的 { } 也属于块作用域。 var 1.没有块级作用域的概念&#xff0c;但具有函数全局作用域、函数作用域的概念 {var a …

【凸优化】二次约束二次规划(QCQP)问题转化为二阶锥规划(SOCP)

二次约束二次规划&#xff08;QCQP&#xff09;问题的SOCP形式转化 1. 问题描述 1.1. QCQP的一般形式&#xff1a; min ⁡ 1 2 x ⊤ Q 0 x c ⊤ x s . t . x ⊤ Q i x a i ⊤ x ≤ b i , i 1 , … , m \begin{aligned} \min \quad &\frac{1}{2}\mathbf{x}^{\top}\math…