一天搞定React(4)——Redux

news2024/12/22 7:46:47

    Hello!大家好,今天带来的是React前端JS库的学习,课程来自黑马的往期课程,具体连接地址我也没有找到,大家可以广搜巡查一下,但是总体来说,这套课程教学质量非常高,每个知识点都有一个小案例,最后有一个总的美团外卖案例教学,大家可以看看我这篇文章,如果能够帮到你们,还请多多点赞o( ̄▽ ̄)d支持支持🌹,如果文章中有错误的或者是遗漏信息,可以在评论区指出或者是与我私信。我看到了消息,一定会及时更正过来∠(°ゝ°)。话不多说,直接开学💪⛽️!

文章目录

    • Redux初体验
    • React中使用Redux
      • 配置基础环境
        • store目录结构设计
    • 使用Redux
      • 创建counterStore
      • 注入store
      • 组件中使用store数据
      • 组件中修改store中的数据
        • 提交action传参
    • Redux异步状态

Redux初体验

Redux是React最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行。

作用:通过集中管理的方式管理应用的状态。

使用步骤:

  1. 定义一个reducer函数(根据当前想要做的修改返回一个新的状态)。

    function reducer (state = {count:0},action){
    //action.type属性是用来标记当前想要做什么样的方法
    	if(action.type === '方法名1'){
    		return{ count:state.count + 1}
    	}
    	if(action.type === '方法名2'){
    		return{ count:state.count - 1}
    	}
    	return state
    }
    
  2. 使用createStore方法传入reducer函数生成一个store实例对象。

    const store = Redux.createStore(reducer)
    
  3. 使用store实例的subscribe方法订阅数据的变化(数据一旦变化,可以得到通知)。

    //回调函数可以在每次state发生变化的时候自动执行
    store.subscribe(()=>{
    	console.log('state变化了')
    })
    
  4. 使用store实例的dispatch方法提交action对象触发数据变化(告诉reducer你想怎么改数据)。

    //方法一操作
    store.dispatch({
    	type:'方法名1'
    })
    //方法二操作
    store.dispatch({
    	type:'方法名2'
    })
    
  5. 使用store实例的getState方法获取最新的状态数据更新到视图中。

    //在步骤三代码里添加store.getState()
    store.subscribe(()=>{
    	console.log('state变化了',store.getState())
    })
    

Redux管理数据流程

image-20240724115341445

为了职责清晰,数据流向明确,Redux把整个数据修改的流程分成了三个核心概念,分别是:state、action和reducer

  1. state-一个对象存放着我们管理的数据状态
  2. action-一个对象用来描述你想怎么改数据
  3. reducer-一个函数更具action的描述生成一个新的state

React中使用Redux

在React中使用redux,官方要求安装俩个其他插件-ReduxToolkit和react-redux。

  1. ReduxToolkit(RTK):官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式。
  2. react-redux:用来链接Redux和React组件的中间件。

配置基础环境

  1. 使用CRA快速创建React项目

    npx create-react-appreact-redux
    
  2. 安装配套工具

    npm i @reduxjs/toolkit react-redux
    
  3. 启动项目

    npm run start
    
store目录结构设计
  1. 通常集中状态管理的部分都会单独创建一个单独的store目录。
  2. 应用通常会有很多个子store模块,所以创建一个modules目录,在内部编写业务分类的子store。
  3. store中的入口文件index.js的作用是组合modules中所有的子模块,并导出store。

使用Redux

整体路径熟悉:

image-20240724120947974

创建counterStore

打开src目录下创建的store包中的modules目录下的counterStore.js文件。

  1. 引入createSlice方法

    import {createSlice} from "@reduxjs/toolkit"
    
  2. 利用createSlice创建一个方法执行一个对象

    //使用state.属性名来进行修改操作
    createSlice({
    	name:''
    	//初始化对象
    	initialState:{
    		属性名:初始值
    	},
    	//定义修改状态的方法,都是同步方法,支持直接修改
    	reducers:{
    		//方法一
    		方法名1(state){
    			//使用state.属性名来进行修改操作
    		}
    		//方法二
    		方法名2(state){
    			//使用state.属性名来进行修改操作
    		}
    	}
    })
    
  3. 使用一个变量接收

    const 变量名(用来接收) = createSlice({
    	name:''
    	//初始化对象
    	initialState:{
    		属性名:初始值
    	},
    	//定义修改状态的方法,都是同步方法,支持直接修改
    	reducers:{
    		//方法一
    		方法名1(state){
    			//使用state.属性名来进行修改操作
    		}
    		//方法二
    		方法名2(state){
    			//使用state.属性名来进行修改操作
    		}
    	}
    })
    
  4. 解构出actionCreater函数

    const{方法名1,方法名2} = counterStore.actions
    
  5. 获取reducer

    const reducer = counterStore.reducer
    
  6. 以按需导入的方式导出actionCreater

    export {inscrement,decrement}
    
    • 以默认导出的方式导出reducer

      export default reducer
      

下面进入store包下的index.js入口文件,将子模块组合起来。点击传送到异步状态学习

  1. 先导入方法和刚刚创建的子模块reducer

    import{ configureStore} from "@reduxjs/toolkit"
    import counterReducer from '文件路径'
    
  2. 调用configureStore进行组合

    configureStore({
    	reducer:{
    		counter:counterReducer
    	}
    })
    
  3. 创建一个变量接收

    const store =configureStore({
    	reducer:{
    		counter:counterReducer
    	}
    })
    
  4. 最后导出store

    export default store
    

注入store

点击传送到异步状态学习

react-redux负责把Redux和React链接起来,内置Provider组件通过store参数把创建好的store实例注入到应用中,链接正式建立。

  1. 来到我们index.js文件里面,导入store

    import store from 'store文件路径'
    
  2. 直接在组件当中注入store

    <组件名 store={store} ></组件名>
    

组件中使用store数据

在React组件中使用store中的数据,需要用到一个钩子函数-useSelector,它的作用是把store中的数据映射到组件中,使用样例如下:

import{ configureStore} from "react-redux"//导入方法

const {count} = useSelector(state => state.counter)

组件中修改store中的数据

React组件中修改store中的数据需要借助另外一个hook函数-useDispatch,它的作用是生成提交action对象的dispatch函数,使用样例如下:

点击传送到异步状态学习

  1. 导入方法

    import{ useDispatch,configureStore} from "react-redux"//再导入useDispatch方法
    
  2. 执行一个useDispatch()

    const dispatch =useDispatch()
    
  3. 使用useDispatch()方法

    import{ 方法名1,方法名2} from "文件路径"
    
    <标签名 onClick={()=>dispatch(方法名1() )}>
    	方法一操作state
    	</标签名>
    
    <标签名 onClick={()=>dispatch(方法名2() )}>
    	方法二操作state
    	</标签名>
    

总结:

  1. 组件中使用哪个hook函数获取store中的数据?
    useSelector
  2. 组件中使用哪个hook函数获取dispatch方法?
    useDispatch
  3. 如何得到要提交action对象?
    执行store模块中导出的actionCreater方法
提交action传参

在reducers的同步修改方法中添加action对象参数,在调用actionCreater的时候传递参数,参数会被传递到action对象payload属性上。

  1. counterStore.js文件中添加修改状态的方法(带参)

    reducers:{
    	方法3(state,action){
    		state.属性名 = action.payload
    	}
    }
    
  2. 之后结构新方法

    const { 方法3 } = counterStore
    
  3. 在标签中使用方法

    <标签名 onClick={()=>dispatch(方法名3(参数) )}>
    	方法三操作带参数action
    	</标签名>
    

Redux异步状态

异步操作:

步骤:

注意⚠️,需要先安装axios才能进行下面步骤,如果没有安装,请跳转到一天搞定React(3)——Hoots组件-CSDN博客这里哦!ღ( ´・ᴗ・` )

  1. 创建store的写法保持不变,配置好同步修改状态的方法。

    const 变量名(用来接收) = createSlice({
    	name:'名字'
    	//初始化对象
    	initialState:{
    		属性名:初始值
    	},
    	//定义修改状态的方法
    	reducers:{
      	方法名(state,action){
    			state.属性名 = action.payload
    			}
    		}
    	}
    })
    
  2. 单独封装一个函数,在函数内部return一个新函数,在新函数中。

    1. 封装异步请求获取数据。

      const 异步变量名 = ()=>{
      	return ()=>{
      		axios.get('后端数据链接🔗')
      	}
      }
      

      也可以进行使用asyncawit方法修饰一下

      const 异步变量名 = ()=>{
      	return async ()=>{
      		const ref = awit axios.get('后端数据链接🔗')
      	}
      }
      
    2. 调用同步actionCreater传入异步数据生成一个action对象,并使用dispatch提交。

      const { 方法名 } = channelStore.actions	//将创建的同步actionCreater方法解构出来
      
      const 异步变量名 = ()=>{
      	return async (dispatch)=>{
      		const ref = awit axios.get('后端数据链接🔗')
      		dispatch(setChannelList(res.获取数据路径))
      	}
      }
      
  3. 最后导出reducers

    export { 异步变量名 }
    
    const 方法名reducer = 变量名(用来接收).reducer
    export default 方法名reducer
    
  4. 来到storeindex.js入口文件注入方法与上面的一致👆

  5. 来到组件中使用,用法也是与上面的一致👆

  6. 组件中dispatch的写法保持不变还是与上面的一致👆

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

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

相关文章

鸿蒙OpenHarmony Native API【drawing_path.h】 头文件

drawing_path.h Overview Related Modules: [Drawing] Description: 文件中定义了与自定义路径相关的功能函数 Since: 8 Version: 1.0 Summary Functions FunctionDescription[OH_Drawing_PathCreate] (void)[OH_Drawing_Path] * 函数用于创建一个路径对象OH_Drawin…

前端页面:用户交互持续时间跟踪(duration)user-interaction-tracker

引言 在用户至上的时代&#xff0c;精准把握用户行为已成为产品优化的关键。本文将详细介绍 user-interaction-tracker 库&#xff0c;它提供了一种高效的解决方案&#xff0c;用于跟踪用户交互的持续时间&#xff0c;并提升项目埋点的效率。通过本文&#xff0c;你将了解到如…

EXO-chatgpt_api 解释

目录 chatgpt_api 解释 resolve_tinygrad_tokenizer 函数 resolve_tokenizer 函数 调试和日志记录​​​​​​​ 参数 返回值 初始化方法 __init__ 异步方法 注意事项 chatgpt_api 解释 展示了如何在一个项目中组织和导入各种库、模块和类,以及如何进行一些基本的We…

双向链表(C语言版)

1. 双向链表的结构 注意&#xff1a;这里的“带头”跟单链表的“头结点”是两个概念&#xff0c;实际上在单链表阶段称呼不太严谨&#xff0c;但是为了更好地理解就直接称为单链表的头结点。带头链表里的头结点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位结点不存储任何有…

rsync文件远程同步

目录 一、什么是rsync远程同步 二、实操rsync远程文件同步 1、配置rsync同步源 2、客户端部署 3、增量备份​编辑 4、删除文件 5、如何实现免交互登录 6、crontab rsync 实现定时同步 7、使用ssh实现rsync数据同步【☆】 如何使用ssh免交互实现数据同步&#xff1f;…

C++ Map Set的模拟实现

C Map Set的模拟实现 文章目录 前言一、Map 和 Set是什么&#xff1f;1.Set2.Map 二、困难点困难一、set和map中值的类型不同困难二、Map和Set中值不可修改困难三、红黑树中迭代器的和--1.2.- - 困难四、map中[ ] 运算符重载的实现1.修改红黑树以及Map和Set中insert的返回值1.修…

Spring Boot入门指南:轻松构建高效Spring应用(四)

Spring Boot入门指南&#xff1a;轻松构建高效Spring应用&#xff08;三&#xff09;-CSDN博客 一.传递参数 7.传递数组 1.在IDEA中写出处理代码 2.打开postman 或者这样:key相同时&#xff0c;也会组成一个数组。 8. 传递集合 如果像数组传参一样传递集合&#xff0c;可能…

Transformer合集

资料 位置编码&#xff1a;https://zhuanlan.zhihu.com/p/454482273 自注意力&#xff1a;https://zhuanlan.zhihu.com/p/455399791 LN&#xff1a;https://zhuanlan.zhihu.com/p/456863215 ResNet&#xff1a;https://zhuanlan.zhihu.com/p/459065530 Subword Tokenizati…

重生之我们在ES顶端相遇第5章-常用字段类型

思维导图 前置 在第4章&#xff0c;我们提到了 keyword&#xff08;一笔带过&#xff09;。在本章&#xff0c;我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。 字段类型 ES 支持以下字段类型&#xff08;仅介绍开发中常用&#xff0c;更多内容请自…

接口自动化测试框架实战-4-日志方法封装

上一小节我们讲解了文件读写方法的封装方法,本小节我们完成一下框架日志的封装方法。 首先我们讲解一下日志封装和日志记录有哪些用处? 更加方便的设置日志的格式和输出方式全局方法可以各个类/函数中都能统一调用分类记录接口用例执行日志,方便嵌入测试报告错误日志提示,…

乘云数字受邀Zabbix MeetUp济南站,分享《DataBuff在打造可观测性数据底座上的探索》

7月20日&#xff0c;Zabbix主办的MeetUp线下活动在济南圆满举行&#xff0c;众多技术大咖汇集现场&#xff0c;交流技术知识、分享先进的思想。乘云数字受邀参加此次盛宴&#xff0c;创始人兼CEO向成钢在现场发表了关于“DataBuff在打造可观测性数据底座上的探索”的主题演讲。…

【多模态】CLIP-KD: An Empirical Study of CLIP Model Distillation

论文&#xff1a;CLIP-KD: An Empirical Study of CLIP Model Distillation 链接&#xff1a;https://arxiv.org/pdf/2307.12732 CVPR 2024 Introduction Motivation&#xff1a;使用大的Teacher CLIP模型有监督蒸馏小CLIP模型&#xff0c;出发点基于在资源受限的应用中&…

NFTScan 浏览器现已支持 .mint 域名搜索功能!

近日&#xff0c;NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询&#xff0c; NFTScan 用户能够轻松地使用域名追踪 NFT 交易&#xff0c;为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…

C++树形结构(2 树的直径)

目录 1.定义&#xff1a; 2.直径的性质&#xff1a; 3.树的直径求解方法&#xff1a; 4.直径端点求解方法&#xff1a; 朴素方法&#xff1a; 优化方法&#xff1a; 5.例题&#xff1a; 6.直径公共点&#xff1a; 7.例题&#xff1a; 8.去掉再加上&#xff1a; 9.例…

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…

vue3前端开发-小兔鲜项目-图片切换效果和动态class

vue3前端开发-小兔鲜项目-图片切换效果和动态class!这次实现的效果是&#xff0c;图片预览效果&#xff0c;根据小图片&#xff0c;来实时改变大图&#xff08;预览&#xff09;的效果。同时让动态的特征class也跟着显示出来。 <script setup> import {ref} from vue // …

【Vue3】响应式数据

【Vue3】响应式数据 背景简介开发环境开发步骤及源码使用 ref 定义基本类型响应式数据使用 reactive 定义对象类型响应式数据使用 ref 定义对象类型响应式数据 ref 和 reactive 的对比使用原则建议 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈…

【C++初阶】string类

【C初阶】string类 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…

day07:用户下单、订单支付

文章目录 地址薄相关相关代码需求分析和设计代码书写 用户下单需求分析和设计代码开发 订单支付微信支付介绍微信支付准备工作如何保证数据安全&#xff1f;如何调用到商户系统 地址薄相关相关代码 需求分析和设计 产品原型接口设计数据库设计 代码书写 地址薄相关代码都是单…

【unity 新手教程 001/100】安装与窗口布局介绍

欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持&#xff01;&#x1f49c;&#x1f49c; Unity下载与安装 &#x1f449;点击跳转详细图文步骤&#xff1a;Unity Hub Unity 编辑器 窗口布局&#xff1a; Hierarchy: 层级窗口 | 默认 Sample Scene (main camera、direc…