Vuex、Redux状态管理库

目录

状态管理库

单一事实来源:存储更新所有组件状态

Vuex

安装

配置

src->store

index:拆分模块modules

vue2

vue3

main

index【以Conversation模块为例】【拆分state等属性】

store state() { return state; }类似于

vue中data() return{数据对象}:多个组件实例时,新建(return{})/引用同一个(:{})

this.$store=store(工具文件中,如Util.ts)

state:原生读this.$store.state.XXX

Getter:修饰读this.$store.getters.XXX

getter 的参数化

mutations :同步修改

this.$store.commit('set_num');

this.$store.commit('模块名/set_num');

this.$store.commit('set_num',参数...);

函数起名

set_stateNm(局部)

SET_stateNm(全局)

参数类型起名

map

value

payload传递对象

actions:处理异步 -await this.$store.dispatch('模块名/set_num')

内部commit

【官方建议】

读/修饰状态放在computed

mapState 辅助函数映射 Vuex 的状态到Vue实例上,可通过this.直接访问

单模块

多模块

mapGetters

mapMutations:methods

mapActions

状态持久化:vuex-persistedstate插件

将Vuex的状态持久化到本地存储中,解决页面刷新或重新打开应用时状态丢失的问题

Redux

组件

与Vuex区别

使用


状态管理库

// 创建全局变量
window.globalVariable = '这是一个全局变量';

单一事实来源:存储更新所有组件状态

Vuex

图来自What is Vuex? | Vuex

安装

npm install vuex --save

配置

src->store

index:拆分模块modules
vue2
import Vue from 'vue';
import Vuex from 'vuex';
import Conversation from './Conversation';
import App from './App';//通过 Vue 插件安装 Vuex,并且在全局注册 this.$store,使得在所有组件中都可以访问到 Vuex 的功能
Vue.use(Vuex);export default new Vuex.Store({
//modules:是一个配置项,用于定义各个模块。
//拆分成多个模块,每个模块可以包含自己的 state、mutations、actions 和 gettersmodules:  {Conversation,App,},
});
vue3
import { createApp } from 'vue';
import { createStore } from 'vuex';const store = createStore({// 配置
});const app = createApp(App);
app.use(store);
app.mount('#app');

main

import Vue from 'vue';
import App from './App';
import router from './router';
import store from './store'; // 引入我们前面导出的store对象Vue.config.productionTip = false;new Vue({el: '#app',router,store, // 把store对象添加到vue实例上components: { App },template: '<App/>',
});

index【以Conversation模块为例】【拆分state等属性】

store state() { return state; }类似于

vue中data() return{数据对象}:多个组件实例时,新建(return{})/引用同一个(:{})

this.$store=store(工具文件中,如Util.ts)

import state from './state';
import actions from './actions';
import getters from './getters';
import mutations from './mutations';const store = {
//namespaced: true 可以帮助区分不同模块中的 actions、mutations 和 getters,避免了命名冲突namespaced: true,state() {return state;},getters,mutations,actions,
};export default store;

state:原生读this.$store.state.XXX

this.$store.state.Conversation.moveConversationList

import LRU from 'lru-cache';
import IMGlobalUtil from '@/util/appconfig';});
// 缓存用户相关的群组基本信息,每条大约640个字符,最多缓存1000条
const groupsCache = new LRU({max: IMGlobalUtil.groupsCacheNumber * 640,
});const state = {summaryMsgMap:{},groups: groupsCache,
};export default state;

Getter:修饰读this.$store.getters.XXX

如果模块名称包含特殊字符或者动态获取 getter 名称时,就需要使用数组语法

this.$store.getters['Conversation/searchGroup'](this.search_value);

getter 的参数化

第一个箭头函数作为 Vuex getter 的定义部分,它可以访问到 state 和 getters,并且将参数传递给第二个箭头函数。

  • 第二个箭头函数则形成了一个闭包,可以访问外部函数(第一个箭头函数)的作用域中的 state 和 getters
const getters = {//消息未读数totalUnReadNum: (state: any, getters: any) => {return state.totalUnReadNum;},//模糊搜索群组searchGroup: (state: any, getters: any) => (str: any) => {let reg = /^[0-9a-zA-Z\-]+$/;str = str.trim();let newArr: any = [];if (str !== '') {state.groups.keys().forEach((key: any) => {let item = state.groups.get(key);if (item.name.indexOf(str) !== -1) {newArr.push(item);}});}return newArr;},//获取群组中某个成员getGroupMember: (state: any, getters: any) => (groupId: any, memberId: any) => {let group = state.groups.get(groupId);if (group && group.memberMap) {return group.memberMap[memberId];}},
};export default getters;

mutations :同步修改

this.$store.commit('set_num');

this.$store.commit('模块名/set_num');

this.$store.commit('set_num',参数...);

函数起名

  • set_stateNm(局部)
  • SET_stateNm(全局)

参数类型起名

  • map
  • value
  • payload传递对象
const mutations = {set_transforMap(state:any,map:any){let length = Object.keys(state.transforMap).length;//最多存100条if(length > 100){state.transforMap = {...map}}else{state.transforMap = { ...state.transforMap, ...map };}},set_lastMsgAi(state: any, value: any) {state.lastMsgAi = value;},set_urgencyList(state: any, payload: any) {state.urgencyList = payload;},//更新网络状态UPDATE_NET_STATUS(state: any, value: any) {state.netStatus = value;},
};export default mutations;

actions:处理异步 -await this.$store.dispatch('模块名/set_num')

内部commit

方法的形参可以直接将commit解构出来

import * as sessionGroupServer from '@/server/sessionGroup';
const actions = {update_sessionGroupList({ state, commit }: any) {sessionGroupServer.getGrouping().then((res: any) => {if (res && res.length) {commit('set_sessionGroupList', res);if (!res.find((item: any) => {return item.groupingKey == state.curSessionGroupKey;})) {commit('set_curSessionGroupKey', 'MIS_grouping_all');}}});},set_bpm_number({commit}:any){bpmNumber().then((res:any)=>{if(res){commit("set_bpm_number",res)}}) },async set_app_info({commit}:any){let res = await  getAppList(1,100);if(res){commit("set_app_info",res)}// getAppList(1,100).then((res:any)=>{//     if(res){//         commit("set_app_info",res)//     }// })}
};export default actions;

【官方建议】

读/修饰状态放在computed

当 Vuex 中的状态发生变化时,computed 属性会自动更新。这避免了手动监听状态变化并进行手动更新的操作

computed: {userName() {return this.$store.state.user.name;}
}
mapState 辅助函数映射 Vuex 的状态到Vue实例上,可通过this.直接访问
单模块
computed: {...mapState(['name']), // 经过解构后,自动就添加到了计算属性中,此时就可以直接像访问计算属性一样访问它...mapState({ aliasName: 'name' }),  // 赋成别名aliasName,这里接收对象,而不是数组}
多模块
//Conversation 模块中的 state.videoMeetingData 映射为当前组件的 videoMeetingData 计算属性。
...mapState('Conversation', {videoMeetingData: (state: any) => state.videoMeetingData,
})
mapGetters
...mapGetters(['getMessage']),
...mapGetters({ aliasName: 'getMessage' }),  // 赋别名的话,这里接收对象,而不是数组

mapMutations:methods

<script>
import { mapMutations } from 'vuex';
export default {methods: {// 注意,mapMutations是解构到methods里面的,而不是计算属性了...mapMutations(['setNumberIsWhat']),},
};
</script>

mapActions


import { mapActions } from 'vuex';async mounted() {await this.setNum({ number: 123 }); // 直接这样调用即可},...mapActions({ setNumAlias: 'setNum' }),   // 赋别名的话,这里接收对象,而不是数组

状态持久化:vuex-persistedstate插件

将Vuex的状态持久化到本地存储中,解决页面刷新或重新打开应用时状态丢失的问题

Redux

redux相当于在顶层组件之上又加了一个组件

组件

  • Action 这是一个用来描述发生了什么事情的对象
  • Reducer 这是一个确定状态将如何变化的地方
  • Store 整个程序的状态/对象树保存在 Store 中
  • View 查只显示 Store 提供的数据

​​

与Vuex区别

Redux比较独立,可以跟很多框架结合使用,不过主要还是跟React配合比较好,也是最常见的React状态管理的库。

在 Vuex 中,有类似于 Redux 的 action 的概念,

但状态变更是通过称为 mutations 的同步函数来处理的,而异步逻辑则需要放在 action 中处理。

使用

//state存储共享数据
function counterReducer(state={count: 0}, action) {//reducer修改stateswitch(action.type){case 'inc':return {count: state.count + state.payload}default:return state;}
}
const store = createStore(counterReducer)
export default store

这样store对象就可以在其他组件中进行使用了,例如在<Bar>组件中。

import React from 'react'
import './Bar.scss'
import { useSelector,useDispatch } from 'react-redux'
export default function Bar() {const count = useSelector((state)=> state.count)//获取共享状态const dispatch=useDispatch();//修改共享状态const handleClick = () => {dispatch({//dispatch触发Reducer,分发actiontype: 'inc',payload: 5})}return (<div><button onClick={handleClick}>修改count</button>     Bar, { count }</div>)
}

在主模块中进行注册。

import { RouterProvider } from 'react-router-dom'
import router from './router';
import { Provider } from 'react-redux'
import store from './store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><Provider store={store}>//注册状态管理与React结合,自动完成重渲染<RouterProvider router={router}></RouterProvider></Provider></React.StrictMode>
);

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

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

相关文章

微软“蓝屏”事件:对全球IT基础设施韧性与安全性的深刻反思

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

数据传输安全--IPSEC

目录 IPSEC IPSEC可以提供的安全服务 IPSEC 协议簇 两种工作模式 传输模式 隧道模式 两个通信保护协议&#xff08;两个安全协议&#xff09; AH&#xff08;鉴别头协议&#xff09; 可以提供的安全服务 报头 安全索引参数SPI 序列号 认证数据 AH保护范围 传输模…

软考-软件设计师(2)-操作系统概述:多级索引、PV操作、段页式存储、磁盘管理、进程管理、有限自动机、I/O设备管理软件分层等高频考点

场景 软考-软件设计师-操作系统概述模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 文件系统多级索引 求文件系统多级索引的最大长度 二级索引=一级索引*一级索引…

vue3使用el-input-number,只能是整数,并且没有四舍五入

效果图 element plus上自带了个属性precision&#xff0c;设置**:precision“0”**,也可以没有小数点&#xff0c;但它这个是四舍五入的&#xff0c;不满足我的需要 我主要用的事件是blur的&#xff0c;input的试过发现值改变了&#xff0c;但是页面显示的没有改变&#xff0c;…

奔跑利润如何释放?来看看怎么分析现货黄金的跟踪止损位

跟踪止损位是现货黄金交易和资金管理中一个重要的概念。我们做现货黄金的时候&#xff0c;将仓位分成两部分&#xff08;或以上&#xff09;。第一部分&#xff0c;我们在首个目标位获利离场&#xff0c;剩下那部分就可以让它奔跑&#xff0c;看看市场会不会走出大行情&#xf…

Java 集合中的 Vector 类和 Stack 类

一.介绍 Java 集合框架提供了一组强大的类和接口来处理和操作对象集合。其中&#xff0c;Vector 和 Stack 类提供了以顺序方式存储和管理元素的基本功能。这两个类都是传统集合的一部分&#xff0c;但由于它们的同步性质和特定用例&#xff0c;它们仍然具有相关性。Vector 类实…

DDoS 究竟在攻击什么?

分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常见的网络攻击形式&#xff0c;攻击者通过向目标服务端发送大量的请求&#xff0c;使目标服务端无法进行网络连接&#xff0c;无法正常提供服务。 DDoS 攻击通常是由大量的分布在全球各地的 “僵尸” 计算机&#xff08…

STM32F401VET6 PROTEUS8 ILI9341 驱动显示及仿真

stm32cubemx新建工程代码&#xff0c;并生成工程 设置gpio 设置SPI 其他的参考stm32默认设置 然后编辑驱动代码 ili9341.h #ifndef ILI9341_H #define ILI9341_H#include <stdbool.h> #include <stdint.h>#include "glcdfont.h" #include "stm32…

物联网Java项目, 2万多TPS如何处理?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「物联网Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;2W个采集点&#xff0…

内网安全:IPC横向

IPC计划任务横向 IPC配合系统服务横向 前言&#xff1a; IPC是为了实现进程之间的通信而开放的管道。IPC可以通过验证用户名和密码来获取相应的权限。通过IPC可以与目标机器建立连接。 IPC计划任务横向 本次目标&#xff1a;通过机器192.168.11.40&#xff0c;横向控制机器192…

学生信息管理系统详细设计文档

一、设计概述 学生信息管理系统是一个用于管理学生信息的软件系统&#xff0c;旨在提高学校对学生信息的管理效率。本系统主要包括学生信息管理、课程信息管理、成绩信息管理、班级信息管理等功能模块。详细设计阶段的目标是确定各个模块的实现算法&#xff0c;并精确地表达这…

图形化开发安卓程序-App Inventor环境搭建一

图形化开发安卓程序-App Inventor环境搭建一 1.概述 现在不用专业的开发技能并可以实现自己DIY一个程序的想法&#xff0c;将天马行空的创意编程现实&#xff0c;配合硬件我们也可以称为当下最流行的AI大师、物联网大师。 2.环境安装 appInvenor开发不依赖本地计算机&#…

数据结构(5.3_1)——二叉树的先中后序遍历

先序遍历——根左右——前缀表达式 中序遍历——左根右——中缀表达式 后序遍历——左右根——后缀表达式 二叉树的遍历(手算) 先序遍历代码 struct ElemType {int value; }; //二叉树的结点(链式存储) typedef struct BiTNode {ElemType data;//数据域struct BiTNode *lchil…

解决kkfileview 使用https预览问题记录

场景&#xff1a;项目使用了开源的kkfileview进行文件在线预览&#xff0c;部署方式使用的是docker&#xff0c;使用IP进行访问&#xff0c;但是http协议直接访问有漏洞告警&#xff0c;现在需要调整为https&#xff0c;且仍然需要使用IP访问。 kkfileview官网kkFileView - 在线…

AI学习记录 - 规范化输出对接现有系统的实例

假设我们有一个学生管理系统&#xff0c;通过prompt提示&#xff0c;格式化输出然后对接现有系统&#xff0c;也是通过react实现&#xff0c;因为这只是一个知识分享&#xff0c;没弄太复杂&#xff08;使用react实现&#xff09;。 学生管理系统 1、设计好prompt getMemory()…

Python对某音乐论坛进行简单的采集

今天简单的用Python来采集一下某论坛的歌曲 环境使用 Python 3.10 Pycharm 模块使用 requests --> 发送请求 pip install requests execjs --> pip install execjs re 正则源码和视频讲解都打包好了&#xff0c;文末名片自取 基本流程 一、数据来源分析 1.明…

手写RPC-令牌桶限流算法实现,以及常见限流算法

为什么需要服务限流、降级 分布式架构下&#xff0c;不同服务之间频繁调用&#xff0c;对于某个具体的服务而言&#xff0c;可能会面临高并发场景。在这样的情况下&#xff0c;提供服务的每个服务节点就都可能由于访问量过大而引起一系列问题&#xff0c;比如业务处理耗时过长、…

VMware三种网络模式---巨细

文章目录 目录 ‘一.网络模式概述 二.桥接模式 二.NAT模式 三.仅主机模式 四.案例演示 防火墙配置&#xff1a; 虚拟电脑配置 前言 本文主要介绍VMware的三种网络模式 ‘一.网络模式概述 VMware中分为三种网络模式&#xff1a; 桥接模式&#xff1a;默认与宿主机VMnet0绑…

基于Java中的SSM框架实现商店积分管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现商店积分管理系统演示 摘要 随着时代的发展&#xff0c;信息化的管理手段已被普遍应用于企业的日常运作中。在当今竞争激烈的市场中&#xff0c;消费者的需求量日益增长&#xff0c;而商品信息的管理也变得越来越复杂&#xff0c;因此&#xff0c;实施…

14. Hibernate 一对多双向关联映射

1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程&#xff0c;你将了解到&#xff1a; 如何实现一对多关联映射&#xff1b; 如何实现双向一对多关联映射&#xff1b; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多&…