【React学习打卡第三天】

发布于:2024-07-30 ⋅ 阅读:(164) ⋅ 点赞:(0)

一、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",
	//初始化state
	initialState:{
		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
……


网站公告

今日签到

点亮在社区的每一天
去签到