React Redux

React Redux是Redux的官方React UI绑定层。它允许您的React组件从Redux存储读取数据,并将操作分派到存储以更新状态。redux是一个管理状态数据state的容器。提供了可预测的状态管理。

React Redux 8.x需要React 16.8.3或更高版本/Rect Native 0.59或更高,才能使用React Hooks。

安装

npm install react-redux
# Or
yarn add react-redux

Store
就是把它们联系到一起的对象。Store 有以下职责:
维持应用的 state;
提供 getState() 方法获取 state;
提供 dispatch(action) 方法更新 state;
通过 subscribe(listener) 注册监听器;
通过 subscribe(listener) 返回的函数注销监听器。

三大原则

1、单一数据源
整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。
2、State 是只读的
唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。
3、使用纯函数来执行修改
为了描述 action 如何改变 state tree ,你需要编写 reducers。

action
所有数据的变化,必须通过派发(dispatch )action来更新
action是一个普通的JavaScript对象,用来描述这次更新的type和content;
使用action的好处是能够知道数据发生了什么变化,数据变化都是可以追踪,可预测的

reducer
联系state和action的一个纯函数,不能产生副作用,将传入的state和action结合起来生成一个新的state

redux 基本使用
安装redux,使用命令:yarn add redux

const initialState = {counter :0
}
// reducer
function reducer(state = initialState,action){switch(action.type){case:"INCREMENT":return {...state,counter:state.counter+1};case:"DECREMENT":return {...state,counter:state.counter-1};case:"ADD_NUMBER":return {...state,counter:state.counter+action.num};case:"SUB_NUMBER":return {...state,counter:state.counter-action.num};defaultreturn state;}
}// store 创建时要求传入reducer
const store = redux.createStore(reducer);// actions
const action1 = {type:"INCREMENT"};
const action2 = {type:"DECREMENT"};
const action3 = {type:"ADD_NUMBER",num:3};
const action4 = {type:"SUB_NUMBER",num:3};
//派发action ,派发之后执行reducer
store.dispatch(action1);
store.dispatch(action2);
store.dispatch(action3);
store.dispatch(action4);

优化,真实开发中我们不可能把所以代码放一起,不方便维护,这里只是基本的使用。

Provider

API概述React Redux包括一个<Provider/>组件,该组件使Redux store可用于应用程序的其余部分:

import React from 'react'
import ReactDOM from 'react-dom/client'import { Provider } from 'react-redux'
import store from './store'import App from './App'// As of React 18
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<Provider store={store}><App /></Provider>,
)

Hooks

React Redux提供了一对自定义React挂钩,允许您的React组件与Redux store 交互。
useSelector从存储状态中读取一个值并订阅更新,
useDispatch返回存储的调度方法以允许您调度操作。

import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import {decrement,increment,incrementByAmount,incrementAsync,selectCount,
} from './counterSlice'
import styles from './Counter.module.css'export function Counter() {const count = useSelector(selectCount)const dispatch = useDispatch()return (<div><div className={styles.row}><buttonclassName={styles.button}aria-label="Increment value"onClick={() => dispatch(increment())}>+</button><span className={styles.value}>{count}</span><buttonclassName={styles.button}aria-label="Decrement value"onClick={() => dispatch(decrement())}>-</button></div>{/* omit additional rendering output here */}</div>)
}

案例

利用 react-redux 构建全局状态管理
● 创建 reducer,在的数里面判断action的type属性,然后返回状态
● 利用 createStore 来捣建 store
● 在 App,js 中导入 store
● 在 App.js 中导入 Provider,在根组件上对整个结构进行包裹,然后设置 store 属性,来统一对 store进行管理

App.js

import LayOut from './pages/LayOut.jsx';
import store from "./store";
import { Provider } from 'react-redux';function App() {return ( <Provider store={store}><div className="App"> <LayOut /></div></Provider>  );
} 
export default App;

LayOut 组件 ,pages/LayOut.jsx
使用useDispatch, useSelector 这两个hooks api 发送提交数据和获取响应的数据

import React from "react";
import { useCallback, useEffect } from "react";
import { setUserInfoAction } from "../store/user/action";
import { useDispatch, useSelector } from "react-redux";const LayOut = () => {const dispatch = useDispatch()const setUserInfo = useCallback((info) => dispatch(setUserInfoAction(info)), [dispatch])const userInfo = useSelector((state) => state.user);const onFinish = () => {setUserInfo({name: "张三",age: "23"});}useEffect(() => {console.log(userInfo)}, [userInfo]);return <div>登录 保存 user info <br />{userInfo?.name} -- {userInfo?.age} <br /><button onClick={onFinish}>登录</button></div>
}
export default LayOut 
// export default connect(   mapState,  mapDispatch   )(MyComponent)

在src 下新建 store 文件如下 (getter/user.js 不需要)
在这里插入图片描述
store 下面的index,js

 import {combineReducers,createStore} from 'redux'; import UserReducer from "./user/reducer"; const reducer = combineReducers({ user: UserReducer,  
}); 
const store = createStore (reducer
); 
export default store; 

store 下的 user 模块 下的 action.js

import * as ActionTypes from "./actionTypes";  
export const setUserInfoAction = (info) => ({type: ActionTypes.SET_USERINFO,info,
}); 
export const clearUser = () => ({type: ActionTypes.CLEAR_USERINFO,
});

store 下的 user 模块 下的actionTypes.js

export const SET_USERINFO = "SET_USERINFO";
export const CLEAR_USERINFO = "CLEAR_USERINFO";

store 下的 user 模块 下的reducer.js


import * as actionTypes from "./actionTypes";
const initState = {name:"",age:""
}export default function reducer(state = initState, action) {const { type, info } = actionswitch (type) {case actionTypes.SET_USERINFO:console.log(info)return infocase actionTypes.CLEAR_USERINFO: {return null}default:return state}
}

用例结果
在这里插入图片描述

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

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

相关文章

在AMD GPU上加速大型语言模型的Flash Attention

Accelerating Large Language Models with Flash Attention on AMD GPUs — ROCm Blogs 引言 在这篇博客文章中&#xff0c;我们将指导您如何在AMD GPU上安装Flash Attention&#xff0c;并提供与在PyTorch中标准SDPA比较其性能的基准测试。我们还将测量Hugging Face中多个大型…

【Java】解决Java报错:FileNotFoundException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 文件路径错误2.2 文件名拼写错误2.3 文件权限问题2.4 文件路径未正确拼接 3. 解决方案3.1 检查文件路径3.2 使用相对路径和类路径3.3 检查文件权限3.4 使用文件选择器 4. 预防措施4.1 使用配置文件4.2 使用日志记录4.3 使用单元测…

上网行为管理的作用是什么?有哪些上网行为管理软件?

上网行为管理在现代企业及家庭环境中扮演着至关重要的角色&#xff0c;其作用不仅限于提升网络安全性&#xff0c;还涉及保护企业信息安全、提高员工工作效率等多个方面。以下将详细阐述上网行为管理的作用&#xff0c;并介绍几款主流的上网行为管理软件。 一、上网行为管理的作…

Neo4j 桌面版打不开踩坑贴

真的踩坑。。。没有人告诉我为啥桌面版和社区版不能一起下啊&#xff01;&#xff01; 我是先下载了社区版之后再下载的桌面版&#xff0c;结果桌面版界面一直打不开。 尝试了网上多种办法都没效果&#xff0c;好多都是说jdk不兼容导致无法打开&#xff0c;让我从JDK 17 ->…

AUTOSAR平台中的信息安全标准模块

面向MCU端的AUTOSAR CP平台加密组件——Crypto ECU中所有的软件单元都遭受到信息安全攻击的可能。AUTOSAR为保障ECU信息和数据安全&#xff0c;定义了CRYPTO 组件,包含 SecOC、KeyM、IdsM、Csm、CryIf 和Crypto Driver 等标准模块。CRYPTO组件提供各种加解密算法以及密钥管理功…

物联网对智慧驾考应用的价值

随着物联网技术的快速发展&#xff0c;传统行业正经历着前所未有的变革。在智慧驾考领域&#xff0c;4G DTU&#xff08;数据传输单元&#xff09;和工业路由器的应用&#xff0c;不仅提升了考试的规范性和效率&#xff0c;更为驾考行业带来了深远影响。作为工业物联网的资深工…

JVM 类加载器的工作原理

JVM 类加载器的工作原理 类加载器&#xff08;ClassLoader&#xff09;是一个用于加载类文件的子系统&#xff0c;负责将字节码文件&#xff08;.class 文件&#xff09;加载到 JVM 中。Java 类加载器允许 Java 应用程序在运行时动态地加载、链接和初始化类。 2. 类加载器的工…

今年的就业环境不容乐观,你想好怎么应对了吗

今年的就业环境不容乐观&#xff0c;你想好怎么应对了吗 毕业生进入职场的历程往往充满挑战和未知&#xff0c;尤其是在当前经济环境下&#xff0c;失业问题愈发凸显。本文通过分享几位年轻人的真实经历&#xff0c;剖析大学生及职场人士面临的困境&#xff0c;并提供应对策略…

手把手带你搭建一个语音对话机器人,5分钟定制个人AI小助手(新手入门篇)

写在前面 如果你的身边有一个随时待命、聪明绝顶的AI小助手&#xff0c;能够听懂你的话&#xff0c;理解你的需求&#xff0c;用温暖的声音回应你&#xff0c;会是一种什么体验&#xff1f; 今天&#xff0c;带大家一起搭建一个语音对话机器人&#xff0c;拥有一个专属的个人…

games101作业7光线追踪 含多线程和微表面提高

对于光线追踪进行综合运用。 光线与三角形求交 其它的emit那些&#xff0c;现在先不用管&#xff0c;后面看看作用是什么。 inline Intersection Triangle::getIntersection(Ray ray) {Intersection inter;if (dotProduct(ray.direction, normal) > 0)//光线从里面打&…

[Shell编程学习路线]——深入理解Shell编程中的变量(理论与实例)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月12日11点40分 &#x1f004;️文章质量&#xff1a;95分 文章目录 ————前言———— 1 自定义变量 &#x1fae0;…

Zynq学习笔记--AXI4-Stream到视频输出IP是如何工作的?

目录 1. 简介 2. 原理详解 2.1 示例工程 2.2 AXI4-Stream to Video Out 3. Master/Slave Timing Mode 3.1 Slave Timing Mode 3.2 Master Timing Mode 4. 总结 1. 简介 本文主要介绍了 AXI4-Stream 到视频输出 的内容。其中&#xff0c;示例工程展示了一个具体的设计&…

GitLab教程(五):高效的工作模式——Feature Branching

文章目录 1.什么是Feature Branching2.Feature Branching的Git实践 1.什么是Feature Branching 特性分支&#xff08;Feature Branching&#xff09;是一种软件开发工作流&#xff0c;尤其在使用Git或其他版本控制系统时被广泛采用。这种策略鼓励开发者为每一个新功能、改进或…

推荐一款好用的读论文软件操作方法

步骤&#xff1a; 1. 使用一译 —— 文档和论文翻译、对照阅读、讨论和社区 2.上传自己想要翻译的论文即可。 示例 Planing论文双语翻译 1.1 Parting with Misconceptions about Learning-based Vehicle Motion Planning 中英文对照阅读 1.2 Rethinking Imitation-based Pl…

SCT82A32 是一款 100V 电压模式控制同步降压控制器

主要特征 ◦ 5.5V-100V 宽输入范围 ◦ 0.8V-60V 可调输出电压 ◦ 0.8V1% 参考电压 ◦ 最低占空比下的40ns 最小 tON ◦ 最高占空比下的150ns 最小 tOFF • 100 KHz 到 1.2 MHz 开关频率 ◦ 时钟同步输入/输出功能 ◦ 可选择二极管仿真或 FPWM • 7.5V 门极驱动器 ◦ 2.3A …

Spring Cloud Gateway 详解:构建高效的API网关解决方案

Spring Cloud Gateway 详解&#xff1a;构建高效的API网关解决方案 Spring Cloud Gateway 是 Spring Cloud 生态系统中用于构建 API 网关的核心组件。它基于 Spring WebFlux 构建&#xff0c;旨在提供简单且有效的方式来路由和增强 API 请求。以下是 Spring Cloud Gateway 的详…

【iOS】YYModel源码阅读笔记

文章目录 前言一、JSON转换库对比二、YYModel性能优化三、YYModel的使用四、架构分析YYClassInfo 剖析 五、流程剖析转换前准备工作 – 将JSON统一成NSDictionary将NSDictionary 转换为Model对象提取Model信息使用NSDictionary的数据填充Model 总结 前言 先前写了JSONModel的源…

如何计算可截素数

什么是可截素数&#xff1f; 它本身是一个素数&#xff0c;如果从左往右逐一截去数字&#xff0c;剩下的仍然都是素数&#xff0c;如果从右往左逐一截去数字&#xff0c;剩下的也仍然都是素数。 例如&#xff1a;3797就是一个可截素数。 从左往右截去数字&#xff1a;797&a…

利用three-csg-ts对做物体交互式挖洞

默认物体均为居中&#xff0c;如果指定位置没有发生偏移&#xff0c;可能是因为在执行布尔操作之前没有正确设置变换。确保在进行布尔运算之前应用所有必要的变换。以下是经过修正的完整代码示例&#xff0c;它会确保圆柱正确旋转并与盒子进行 CSG 操作。 安装依赖 首先&…

如何实现网络隔离后,军工单位内网数据导出的安全性?

在现代信息化战争中&#xff0c;军工单位在信息安全方面的需求尤为突出。通常会采用物理隔离&#xff0c;将网络隔离成内网和外网&#xff0c;防止外部网络的恶意入侵和数据窃取。隔离后的数据仍存在内外网交换的需求&#xff0c;即涉及到内网数据导出&#xff0c;因此每日会面…