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中多个大型…

软件开发工程师的工作内容

软件开发&#xff0c;通俗说就是写程序&#xff0c;就是把一串一串的命令组合起来&#xff0c;让它来替我们完成某种特定任务。软件开发工程师就是从事软件开发相关工作的人员的统称。 在软件开发的整个流程中&#xff0c;软件开发工程师最主要负责的阶段是软件的编码阶段&…

【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 使用单元测…

几分钟带你初步了解人工智能

目录 1. 什么是人工智能&#xff1f; 2. 人工智能的发展 2.1 人工智能的发展可以追溯到20世纪50年代。以下是人工智能发展的主要阶段&#xff1a; 3.人工智能发展的利与弊 4.人工智能算法有哪些&#xff1f; 4.1 人工智能算法包括线性回归、逻辑回归、决策树、朴素贝叶斯、…

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

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

Neo4j 桌面版打不开踩坑贴

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

m2_python字符串-索引与切片

# 索引&#xff1a;查找存取字符串中某一个位置元素[]s "sensizlik"for i in s:print(i)print(s[0]) # 第一个元素 print(s[-1]) # -1倒数第一个元素 print(s[-2]) # -2倒数第二个元素 print("len", len(s)) i 0 while i < len(s):print(s[i…

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. 类加载器的工…

metersphere提取的字典需要修改其中某个key的值后作为下一接口入参

在测试过程中遇到这样的一种场景&#xff0c;下一个接口的某个字段入参为一个json对象&#xff0c;该对象的值是上一个接口返回的内容&#xff0c;但是其中的某个值不是&#xff0c;需要修改后才能作为下个接口的入参整体传入 上一个接口返回的内容如下&#xff1a; {"s…

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

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

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

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

Python中的“*”和“**”

1.接受任意长度形参&#xff0c;组成turple def function(*args):# type(args)turple# args(1, 2, 3, 4)print(args)ant0for i in range(len(args)):antargs[i]return antprint(function(1,2,3,4)) # 102.接受任意长度形参&#xff0c;组成dict def function(**args):# type…

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或其他版本控制系统时被广泛采用。这种策略鼓励开发者为每一个新功能、改进或…

Go 语言在云计算和分布式系统开发中的优势和挑战是什么?

Go语言在云计算和分布式系统开发中有以下优势&#xff1a; 并发性能&#xff1a;Go语言具有轻量级的协程&#xff08;goroutine&#xff09;和高效的调度器&#xff0c;能够轻松地实现高并发和并行计算&#xff0c;适合处理大量的请求和任务。 高效的网络编程&#xff1a;Go语…

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

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