当前位置: 首页 > news >正文

React-Redux学习笔记(自用)

1. 环境搭建

插件安装:Redux Toolkit和react-redux

npm i @reduxjs/toolkit react-redux

2、

store目录结构设计

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

3、使用React Toolkit创建counterStore

创建各模块的store
counterStore.js

import { createSlice } from "@reduxjs/toolkit";// 创建store
const counterStore = createSlice({name: 'counter',// 初始化stateinitialState: {count: 0},// 修改状态的方法 reducers: {inscrement(state) {state.count++;},decrement(state) {state.count--;}}
})// 结构出actionCreater函数
const {inscrement, decrement} = counterStore.actions
// 获取reducer
const reducer = counterStore.reducer// 以按需导出的方式导出actionCreater
export {inscrement, decrement}
// 以默认导出的方式导出reducer
export default reducer

在index,js中组合store

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

4、为React注入store

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

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import store from './store';
import { Provider } from 'react-redux';const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><Provider store={store}><App /></Provider></React.StrictMode>
);reportWebVitals();

5、在React组件中使用store中的数据

使用useSelector钩子函数,把store中的数据映射到组件中


import React from 'react';
import './App.css';import { useSelector } from 'react-redux';function App() {// 这里state.counter和store中的reducer.counter是对应的const {count} = useSelector(state => state.counter);return (<React.Fragment><div>{count}</div></React.Fragment>);
}export default App;

6、React组件中修改store中的数据

引入useDispatch钩子函数,作用:生成提交的action对象的dispatch函数


import React from 'react';
import './App.css';import { useDispatch, useSelector } from 'react-redux';// 倒入actionCreater
import {inscrement, decrement} from './store/modules/counterStore'function App() {// 这里state.counter和store中的reducer.counter是对应的const {count} = useSelector(state => state.counter);const dispatch = useDispatch()return (<React.Fragment><div>{/* 调用dispatch提交action对象 */}<button onClick={()=> dispatch(decrement())}> - </button><span>{count}</span><button onClick={() => dispatch(inscrement())}> + </button></div></React.Fragment>);
}export default App;

7、在action中传参

在reducers的同步修改方法中添加action对象参数,在调用actionCreator时传递参数,参数会被传递到action对象的payload属性上
定义方法:通过payload获取传入的参数

import { createSlice } from "@reduxjs/toolkit";// 创建store
const counterStore = createSlice({name: 'counter',// 初始化stateinitialState: {count: 0},// 修改状态的方法 reducers: {inscrement(state) {state.count++;},decrement(state) {state.count--;},addToNum (state, action) {// payload是固定属性state.count = action.payload}}
})// 解构出actionCreater函数
const {inscrement, decrement, addToNum} = counterStore.actions
// 获取reducer
const reducer = counterStore.reducer// 以按需导出的方式导出actionCreater
export {inscrement, decrement, addToNum}
// 以默认导出的方式导出reducer
export default reducer

使用

        <button onClick={() => dispatch(addToNum(10))}> add To 10</button><button onClick={() => dispatch(addToNum(20))}> add To 20</button>

8、异步代码

  1. store写法不变
  2. 单独封装一个函数,返回一个新函数,在新函数中:封装异步请求获取数据,并调用同步actionCreater传入异步数据生成一个action对象,并使用dispatch提交
    channelStore.js
import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";const channelStore = createSlice({name: 'channel',initialState: {channelList: []},reducers: {setChannels(state, action) {state.channelList = action.payload}}
})// 异步请求部分
const {setChannels} = channelStore.actionsconst fetchChannelList = () =>{return async (dispatch) => {const res = await axios.get('http://geek.itheima.net/v1_0/channels')dispatch(setChannels(res.data.data.channels))}
}const reducer = channelStore.reducer
export {fetchChannelList}
export default reducer
  1. 组件中dispatch的写法保持不变
    store/index.js不变
import { configureStore } from "@reduxjs/toolkit";
// 导入子模块reducer
import counterReducer from './modules/counterStore'
import channelReducer from './modules/channelStore'const store = configureStore({reducer: {counter: counterReducer,channel: channelReducer}
})  export default store

在组件中使用

import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';// 倒入actionCreater
import { fetchChannelList } from './store/modules/channelStore';function App() {const {channelList} = useSelector(state => state.channel)const dispatch = useDispatch()useEffect(() => {dispatch(fetchChannelList())}, [])return (<React.Fragment><div>{/* 调用dispatch提交action对象 */}<ul>{channelList.map(item => <li key={item.id}>{item.name}</li>)}</ul></div></React.Fragment>);
}export default App;

相关文章:

  • Java Stream流应用
  • Android SurfaceFlinger——概述(一)
  • (3) cmake编译多个cpp文件
  • [AI aider] 打造终端AI搭档:Aider让编程更智能更有趣!
  • WPF 一个执行耗时任务,页面更新等待时间的例子
  • 【计算机毕业设计】211校园约拍微信小程序
  • Vue跨标签页数据通信
  • 广告变现小游戏对接广告流量变现平台开发 源码搭建
  • Vue在表单校验中trigger属性指定何时触发校验规则
  • 路由框架 ARouter 原理及源码解析
  • Linux-目录和文件
  • Blazor的SSR服务端渲染是不是交互式的
  • 数据结构:3.3.4遍历应用例子
  • 达索系统基于模型的系统工程:开启创新与高效的新时代
  • Golang | Leetcode Golang题解之第145题二叉树的后序遍历
  • [nginx文档翻译系列] 控制nginx
  • 0x05 Python数据分析,Anaconda八斩刀
  • const let
  • Electron入门介绍
  • Java应用性能调优
  • Just for fun——迅速写完快速排序
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue2 SSR 的优化之旅
  • Vue全家桶实现一个Web App
  • 百度地图API标注+时间轴组件
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 算法---两个栈实现一个队列
  • 用Canvas画一棵二叉树
  • ​补​充​经​纬​恒​润​一​面​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 飞书APP集成平台-数字化落地
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (04)odoo视图操作
  • (19)夹钳(用于送货)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (HAL库版)freeRTOS移植STMF103
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (分布式缓存)Redis哨兵
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (六)c52学习之旅-独立按键
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (五)关系数据库标准语言SQL
  • (转)甲方乙方——赵民谈找工作
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)为C# Windows服务添加安装程序
  • (轉貼) UML中文FAQ (OO) (UML)
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET BackgroundWorker
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 解决重复提交问题