【React学习打卡第三天】

一、Redux快速上手

1.概念

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

作用:通过集中管理的方式管理应用的状态
案例:使用纯Redux实现计数器
在这里插入图片描述

2.快速体验(纯redux计数案例)

<button id="decrement">-<button/>
<span id="count">0<span/>
<button id="increment">+<button/>
//1. 定义一个 reducer 函数 (根据当前想要做的修改返回一个新的状态)
function reducer(state={count:0},action){//数据不可变:基于原始状态生成一个新的状态if(action.type === 'INCREMENT'){return {count:state.count+1}}if(action.type==='DECREMENT'){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变化了“,state.getState())document.getElementById('count').innerText=store.getState().count})
//4. 使用store实例的 dispatch方法提交action对象 触发数据变化(告诉reducer你想怎么改数据)
const inBtn = document.getElementById('increment')
inBtn.addEventListener('click',()=>{//增store.dispatch({type:"INCREMENT"})
})
const inBtn = document.getElementById('dncrement')
inBtn.addEventListener('click',()=>{//减store.dispatch({type:"DECREMENT"})
})
//5. 使用store实例的 getState方法 获取最新的状态数据更新到视图中

3.三个核心概念

为了职责清晰,数据流向明确,Redux把整个数据修改的流程分成了三个核心概念,分别是:state、action和reducer
state-一个对象 存放着我们管理的数据状态
action - 一个对象 用来描述你想怎么改数据
reducer - 一个函数 根据action的描述生成一个新的state
在这里插入图片描述

二、Redux与React-环境准备

1.配套工具

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

2.配置基础环境

(1). 使用 CRA 快速创建 React 项目
npx create-react-app react-redux
(2). 安装配套工具
npm i @reduxjs/toolkit react-redux
(3). 启动项目
npm run start

3.store目录结构设计在这里插入图片描述

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

三、Reduc与React-实现counter

在这里插入图片描述

1.使用React Toolkit 创建 counterStore

子模块的创建:

// store/modules/counterStore.js
import {createSlice} from "@reduxjs/toolkit"
const counterStore=createSlice({name:"counter",//初始化stateinitialState:{count:0},//修改状态的方法,同步方法,支持直接修改reducer:{increment(state){state.count++},decrement(state){state.count--}}
})
//解构出来actionCreater函数
const {increment,decrement}=counterStore.actions
//获取reducer
const reducer =counterStore.reducer
//以按需导出的方式导出actionCreater
export {increment,decrement}
//z以默认导出的方式导出reducer
export default reducer

子模块的整合:

// store/index.js
import {configureStore} from "@reduxjs/toolkit"
//导入子模块reducer
import counterReducer from "./modules/counterStore"
const store = configureStore({reducer:{counter:counterReducer}
})
export default store

2.为React注入store

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

index.js:
在这里插入图片描述

3.React组件使用store中的数据

在React组件中使用store中的数据,需要用到一个 钩子函数 - useSelector,它的作用是把store中的数据映射到组件
在这里插入图片描述

在app.js组件中使用数据:

//App.js
import {useSelector}from 'react-redux'
function App(){const {count}=useSelector(state=>state.counter)return (<div className="App">{count}<div/>)
}

3.React组件修改store中的数据

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

//App.js
import {useDispatch,useSelector}from 'react-redux'
//导入actionCreater
import {increment,decrement}from './store/moduls/counterStore'
function App(){const {count}=useSelector(state=>state.counter)const dispatch=useDispatch()return (<div className="App"><button onClick={()=>dispatch(decrement())}>-</button>{count}<button onClick={()=>dispatch(decrement())}>+</button><div/>)
}

四、提交action传参实现需求

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

在reducers的同步修改方法中添加action对象参数,在调用actionCreater的时候传递参数,参数会被传递到action对象payload属性
在这里插入图片描述

五、异步状态操作

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

在这里插入图片描述

在这里插入图片描述

2. 单独封装一个函数,在函数内部return一个新函数,在新函数中

封装异步请求获取数据
调用同步actionCreater传入异步数据生成一个action对象,并使用dispatch提交
在这里插入图片描述

在这里插入图片描述

3. 组件中dispatch的写法保持不变

在这里插入图片描述
在这里插入图片描述

六、Redux调试 - devtools

Redux官方提供了针对于Redux的调试工具,支持实时state信息展示,action提交信息查看等

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、美团外卖案例

1.分类和商品列表渲染

启动项目(mock服务 + 前端服务 ):npm run serve && npm run start
使用RTK编写store(异步action)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组件触发action并且渲染数据
App.js:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.点击分类激活交互实现

使用RTK编写管理activeIndex
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组件中点击时触发action更改activeIndex
在这里插入图片描述

动态控制激活类名显示
在这里插入图片描述

3.商品列表切换显示

条件渲染:控制对应项显示
activeIndex === index && 视图
在这里插入图片描述

4.添加购物车实现

使用RTK管理新状态cartList
在这里插入图片描述

思路:如果添加过,只更新数量count,没有添加过,直接push进去
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

组件中点击时收集数据提交action添加购物车
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.统计区域功能实现

基于store中的cartList的length渲染数量
在这里插入图片描述
在这里插入图片描述

基于store中的cartList累加price * count
在这里插入图片描述
在这里插入图片描述

购物车cartList的length不为零则高亮
在这里插入图片描述
在这里插入图片描述

6.购物车列表功能实现

使用cartList遍历渲染列表
RTK中增加增减reducer,组件中提交action
在这里插入图片描述
在这里插入图片描述

RTK中增加清除购物车reducer,组件中提交action
……

7.控制购物车显示和隐藏

使用useState声明控制显隐的状态
在这里插入图片描述
点击统计区域设置状态为true
……
点击蒙层区域设置状态为false
……

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

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

相关文章

SpringMvc有几个上下文

你好&#xff0c;我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分&#xff0c;其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图&#xff0c;深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …

数据结构初阶(c语言)-双向链表

这里首先纠正上篇文章一个错误&#xff0c;链表的一个有效数据点应该称为结点而不是节点。 一&#xff0c;双向链表的概念与结构 1.1概念与结构示意图 我们所说的双向链表全称为带头双向循环链表&#xff0c;也就是说此链表带有哨兵位结点(不存放任何数据的结点&#xff0c;且…

【Git多人协作开发】知识点总结

目录 知识点总结 1.创建dev分支开发 1.1在本地创建 1.1在远程创建&#xff08;推荐&#xff09; 2.远程分支和本地分支建立连接☞pull和push操作 2.1情况1 2.2情况2 2.3情况3 3.本地仓库对远程仓库的拉取pull操作 3.1情况1 3.2情况2 4.将开发分支的内容合并到远程m…

【Week-G5】适用于图像翻译的pix2pix模型-Pytorch版本

文章目录 1、基础知识1.1 图像翻译1.2 CGAN1.3 U-Net1.4 Pix2Pix 2、运行代码 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 本次主要学习Pix2Pix网络&#xff0c;常用于图像翻译&#…

CVE-2020-7248 OpenWRT libubox标记二进制数据序列化漏洞(更新中)

提要 该文档会一直处于更新当中&#xff0c;当状态为完毕后&#xff0c;才是更新完成。由于网络上关于该漏洞原理的分析文档和资源实在是太少&#xff0c;而本人关于该方向也才是刚入门&#xff0c;能力有限&#xff0c;所以复现需要的时间较长&#xff0c;需要补充和学习的东西…

用Manim实现【多边形】类的实现——[上]

用Manim实现【多边形】类的实现——[上] Polygram内容是关于不同几何图形的分类&#xff0c;特别是涉及多边形&#xff08;Polygon&#xff09;及其扩展形式&#xff0c;比如多图形&#xff08;Polygram&#xff09;。在manim中有10中特征&#xff0c;接下来5种类及其特征的解…

搜维尔科技:Cyber​​glove通过其前所未有的柔性传感器技术,带来了多年的经验、专业知识和可靠性

Cyberglove 概述 新一代数据手套技术 MoCap 手套采用了原始 CyberGlove 产品 20 年经验所建立的技术&#xff0c;产生了改进的和新的特性、能力和设计&#xff0c;非常适合动作捕捉环境。 旧与新相遇&#xff0c; Cyberglove 通过其前所未有的柔性传感器技术&#xff0c;带来…

linux自动化构建工具--make/makefile

目录 1.make/makefile介绍 1.1基本认识 1.2依赖关系、依赖方法 1.3具体操作步骤 1.4进一步理解 1.5默认设置 1.6make二次使用的解释 1.7两个文件的时间问题 1.8总是被执行 1.9特殊符号介绍 1.make/makefile介绍 1.1基本认识 make是一个指令&#xff0c;makefile是一…

mysql面试(六)

前言 本章节详细讲解了一下mysql执行计划相关的属性释义&#xff0c;以及不同sql所出现的不同效果 执行计划 一条查询语句经过mysql查询优化器的各种基于成本和各种规则优化之后&#xff0c;会生成一个所谓的 执行计划&#xff0c;这个执行计划展示了这条查询语句具体查询方…

django 小型超市库存与销售管理系统-计算机毕业设计源码46608

摘 要 随着信息技术的快速发展&#xff0c;超市库存与销售管理面临着前所未有的挑战与机遇。为了提升超市的运营效率&#xff0c;优化库存管理&#xff0c;并增强销售数据的分析能力&#xff0c;我们基于Django框架设计并开发了一套小型超市库存与销售管理系统。该系统充分利用…

运算符的运算顺序

【单目算术位关系&#xff0c;逻辑三目后赋值】 ![在这里插入图片描述] (https://i-blog.csdnimg.cn/direct/e4c8f4e22b5044a48154bf7378e3b3b3.png)

php 做一个mqtt按钮,发布触发信号

在之前博客php 做一个文件下载服务器&#xff0c;得避免跨路径工具&#xff0c;安全很重要 中加了一个按钮&#xff0c;触发物联网设备返回数据。基于mqtt开发&#xff0c;如果想知道mqtt如何搭建&#xff0c;可以看我的博客【MQTT&#xff08;1&#xff09;】服务端的搭建 效…

机器学习 | 回归算法原理——多重回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的多项式回归继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多重回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;欢迎大家交流学习&#xff01; 目录 一…

Air780EP模块 LuatOS开发-MQTT接入阿里云应用指南

简介 本文简单讲述了利用LuatOS-Air进行二次开发&#xff0c;采用一型一密、一机一密两种方式认证方式连接阿里云。整体结构如图 关联文档和使用工具&#xff1a;LuatOS库阿里云平台 准备工作 Air780EP_全IO开发板一套&#xff0c;包括天线SIM卡&#xff0c;USB线 PC电脑&…

产品经理-​统计数据是如何产生的(20)

在互联网当中,监测一个项目的实际情况,在产品当中,往往需要进行数据的监测,看用户的习惯,进而进行对产品进行优化,比如统计产品用户的一些行为,鼠标点击,鼠标hover,停留时长,进入,进出等 产品经理看到的数据统计一般是经历了下面几个阶段 数据埋点&#xff1a;这个阶段产品经理…

RK3568笔记四十三:MPU6050驱动开发(硬件I2C_3)

若该文为原创文章&#xff0c;转载请注明原文出处。 正点原子提供的I2C有测试ap3216c&#xff0c;SH3001等传感器&#xff0c;根据手册操作可以实现效果。 这里记录使用I2C3驱动MPU6050. 记录原因是前面有模拟I2C&#xff0c;但硬件如何使用&#xff0c;有点不是很清楚&#…

猫头虎分享:GPT-4o Mini VS GPT-3.5 Turbo 新旧对决,谁能拔得头筹?

GPT-4o Mini VS GPT-3.5 Turbo &#x1f31f; 新旧对决&#xff0c;谁能拔得头筹&#xff1f; 我们正在进入廉价语言模型的新时代 &#x1f680; 阅读时间&#xff1a;6分钟 摘要&#xff1a; 尽管 GPT-4o 功能强大&#xff0c;但我并不经常使用它。如果我正在寻找一个用于复…

【Hec-Ras】案例1:韩国Seung-gi stream稳定流/非稳定流模拟

Hec-Ras案例1&#xff1a;韩国Seung-gi stream 研究区域&#xff1a;Seung-gi stream&#xff08;韩国&#xff09;研究数据降水数据&#xff08;Rainfall data&#xff09; 步骤1&#xff1a;创建工程文件/打开已有工程文件步骤2&#xff1a;参数调整步骤2.1&#xff1a;数据导…

mysql 数据库空间统计sql

mysql 数据库空间统计 文章目录 mysql 数据库空间统计说明一、数据库存储代码二、查询某个数据库的所有表的 代码总结 说明 INFORMATION_SCHEMA Table Reference 表参考 information_schema是‌MySQL中的一个特殊数据库&#xff0c;它存储了关于所有其他数据库的元数据信息。…

D4.前缀和、差分

前缀和 一维前缀和&#xff08;区间&#xff09; 这样的好处是&#xff0c;可以以O(1)的时间复杂度来计算。而不是遍历O(n)。当读入数据非常大&#xff08;>1000000&#xff09;的时候&#xff0c;建议使用scanf()来读取数据&#xff0c;会比cin >> 快很多。在全局开…