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

【React】状态管理

两个状态管理工具:

  1. dva 是一个基于 Redux 和 React Router 的数据流方案,它提供了对 Redux 和 React Router 的封装,使得在使用 dva 时可以更方便地进行状态管理和路由操作。
  2. React Redux是一个JavaScript状态管理库,它的核心包括store、action和reducer。store负责存储和管理状态,action描述状态变化,reducer则根据旧状态和action计算新状态。

简单来说,

  • useState可以直接更新状态;
  • useReducer通过dispatch多个action来更新状态,reducer函数脱离了UI,可以独立复用;
  • useSelector负责从store全局中读取和渲染状态,useDispatch负责通过分发action,更新store状态,二者都存在于React-Redux中;
  • connect是存在于dva中,负责从store中读取状态,并传递给组件。

  • useState

 直接更新状态。

  • useReducer

 可以脱离了UI,可以独立复用。但无法像redux一样进行跨组件的状态共享。

对于拥有许多状态更新逻辑的组件来说,过于分散的事件处理程序可能会令人不知所措。对于这种情况,你可以将组件的所有状态更新逻辑整合到一个外部函数中,这个函数叫作 reducer。

使用 reducer 管理状态与直接设置状态略有不同。它不是通过设置状态来告诉 React “要做什么”,而是通过事件处理程序 dispatch 一个 “action” 来指明 “用户刚刚做了什么”。(而状态更新逻辑则保存在其他地方!)

function handleAddTask(text) {
// "action" 对象:dispatch({type: 'added',id: nextId++,text: text,});
}function handleChangeTask(task) {dispatch({type: 'changed',task: task,});
}function handleDeleteTask(taskId) {dispatch({type: 'deleted',id: taskId,});
}

“action”是一个普通的 JavaScript 对象。它的结构是由你决定的,在后面的步骤中,你将会学习如何添加一个 dispatch 函数。

reducer 函数就是你放置状态逻辑的地方。它接受两个参数,分别为当前 state 和 action 对象,并且返回的是更新后的 state,如下(在 reducer 中使用 switch 语句 是一种惯例):

function tasksReducer(tasks, action) {switch (action.type) {case 'added': {return [...tasks,{id: action.id,text: action.text,done: false,},];}case 'changed': {return tasks.map((t) => {if (t.id === action.task.id) {return action.task;} else {return t;}});}case 'deleted': {return tasks.filter((t) => t.id !== action.id);}default: {throw Error('未知 action: ' + action.type);}}
}

最后,在组件中导入taskReducer

import { useState } from 'react';
⬇️
import { useReducer } from 'react';const [tasks, setTasks] = useState(initialTasks);
⬇️
const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);
  • useSelector、useDispatch

用法:首先通过reducer给state赋值num

const reducer = (state, action) => {switch (action.type) {case "decrement":return { ...state, num: state.num - 1 };case "increment":return { ...state, num: state.num + 1 };default:return state;}
}

先通过createStore将state存入redux store

const store = createStore(reducer, initialState);

接着通过provider把state传给子组件

const ComponentUseReactRedux = () => {return (<div><h2>ComponentUseReactRedux</h2><Provider store={store}><ChildComponentUseReactRedux /></Provider></div>)
}

最后在子组件里,useSelector负责读取和渲染状态,useDispatch负责触发状态更新

  • 通过useSelector(选择器函数)从store全局状态里提取需要的部分,这里是state里的num。当 dispatch(action) 触发 reducer 修改状态后,Store 会通知所有订阅的组件。
  • useSelector 会比较 上一次选择器返回值 和 新返回值: 如果不同(!==),组件重新渲染。 如果相同,组件不会重新渲染(避免不必要的更新)。
  • useDispatch通过distpatch触发状态更新,dispatch(action) 是 Redux 中触发状态更新的唯一方式
const ChildComponentUseReactRedux = () => {const num = useSelector(state => state.num);const dispatch = useDispatch();return (<div><h3>Using useSelector, useDispatch</h3>Number: {num}//组件调用,dispatch(action),store传递state和action//reducer会根据action计算新状态,store更新状态并通知组件<button onClick={() => dispatch({ type: "increment" })}>+</button><button onClick={() => dispatch({ type: "decrement" })}>-</button></div>);
}

http://www.dtcms.com/a/308847.html

相关文章:

  • Spring 面试点(八股)
  • review| advance
  • wxPython 实践(五)高级控件
  • 企业对于DDOS攻击有哪几种安全防护对策?
  • 选择跨网文件交换系统的核心因素有哪些?
  • Kafka Streams性能优化实践指南:实时流处理与状态管理
  • 脚手架搭建React项目
  • LCGL基本使用
  • 智慧园区通行效率↑68%!陌讯多模态融合算法的实战解析
  • 【C++】1·入门基础
  • C语言基础第18天:动态内存分配
  • 什么是 MySQL 的索引?常见的索引类型有哪些?
  • 【动态规划】数位dp
  • 【AD】域管理员登录错误
  • Google政策大更新:影响金融,Ai应用,社交,新闻等所有类别App
  • 王道考研-数据结构-01
  • Qt_Gif_Creator 基于Qt的屏幕gif录制工具
  • 汽车线束行业AI智能化MES解决方案:推动智能制造与质量升级
  • cpu运行 kokoro tts 服务器语音转化首选
  • 为什么 Batch Normalization 放在全连接/卷积层的输出之后?
  • linux如何将两份hdmi edid合并
  • 硬件电路基础学习
  • Cesium 快速入门(五)坐标系
  • LangGraph底层原理与基础应用入门
  • vue3可编辑表格
  • linux自动构建工具make/makefile
  • 【计算机网络】5传输层
  • MySQL 中的 JOIN 操作有哪些类型?它们之间有什么区别?
  • 国标gb28181 SIP协商详细分析
  • 《嵌入式C语言笔记(十七):进制转换、结构体与位运算精要》