React---day11

14.4 react-redux第三方库

提供connect、thunk之类的函数


以获取一个banner数据为例子

store

我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数

import { configureStore } from '@reduxjs/toolkit';//Redux Toolkit 推荐的创建 store 的方法,自动集成了开发工具和中间件。
import rootReducer from './reducer/reducer.js'//项目中所有 reducer 的集合
//configureStore 已经自动集成了 redux-thunk
const store = configureStore({ reducer: rootReducer });
export default store;

action

import { CHANGE_BANNERS } from './constant.js'   // 导入 action 类型常量
import axios from 'axios'                        // 导入 axios 用于发起 HTTP 请求// 普通 action creator,返回一个 action 对象
export const changeBannersAction = (data) => ({type: CHANGE_BANNERS,      // action 类型payload: data              // 传递的数据
});

**reducer:**我们是先写了一个总的reducer,合并多个 reducer,生成根 reducer 并导出,用于 Redux 的全局状态管理。

import { combineReducers } from 'redux';
import bannerReducer from './bannerReducer';const rootReducer = combineReducers({banner : bannerReducer
});export default rootReducer;

分reducer:bannerReducer

import { CHANGE_BANNERS } from "../constant"
// 初始化状态
const initailState = {banner : []
}
// 据不同的 action 类型决定如何更新 state。
const bannerReducer = (state = initailState , action) => {switch(action.type){default:return state;}}export default bannerReducer;

constant:

定义一些常量

引入store:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import store from './store';
// 引用provider将store进行传递
import { Provider } from 'react-redux';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Provider store={store}><App /></Provider>
);

为什么要使用中间件???因为reducer必须是纯函数,这意味着它不能直接处理异步操作,异步操作必须在action之后的中间件处理之后生成原始的action,这样,reducer函数就能处理相应的action,从而改变state,更新UI。

thunk有什么缺点:

  • Redux Thunk 在处理异步操作时,通常需要编写大量的样板代码。
  • Redux Thunk 将异步逻辑与 Redux 的 action 紧密耦合在一起。这意味着 action creator 不仅需要定义 action 类型,还需要处理异步逻辑。

saga:

引入:创建中间件,应用中间件,run中间件

import { configureStore } from '@reduxjs/toolkit';
import createSagaMiddleware from 'redux-saga';
import mySaga from './saga';
import rootReducer from './reducer';
// 创建saga中间件
const sagaMiddleware = createSagaMiddleware();
// 定义store:reducer+中间件
const store = configureStore({reducer: rootReducer,middleware: (getDefaultMiddleware) =>getDefaultMiddleware().concat(sagaMiddleware)
});
// 使用中间件
sagaMiddleware.run(mySaga);export default store;

saga.js中监听actionTyp然后执行逻辑代码

import {put, takeEvery} from 'redux-saga/effects'
import axios from 'axios'
import { FETCH_HOME_MULTIDATA } from './constant';
import { changeBannersAction } from './actionCreator';
// 定义异步函数:*
function* fetchHomeMultidata(){const res =  yield axios.get('http://123.207.32.32:8000/home/multidata')const  banner = res.data.data.banner.list;
//    发送yield put(changeBannersAction(banner))
}
// 监听
function* mySaga(){yield takeEvery( FETCH_HOME_MULTIDATA, fetchHomeMultidata )
}export default mySaga;

redux-thunk
const store = configureStore({ reducer: rootReducer });
export default store;


**action**:

import { CHANGE_BANNERS } from ‘./constant.js’ // 导入 action 类型常量
import axios from ‘axios’ // 导入 axios 用于发起 HTTP 请求

// 普通 action creator,返回一个 action 对象
export const changeBannersAction = (data) => ({
type: CHANGE_BANNERS, // action 类型
payload: data // 传递的数据
});


**reducer:**我们是先写了一个总的reducer,合并多个 reducer,生成根 reducer 并导出,用于 Redux 的全局状态管理。

import { combineReducers } from ‘redux’;
import bannerReducer from ‘./bannerReducer’;

const rootReducer = combineReducers({
banner : bannerReducer
});

export default rootReducer;


分reducer:**bannerReducer**:

import { CHANGE_BANNERS } from “…/constant”
// 初始化状态
const initailState = {
banner : []
}
// 据不同的 action 类型决定如何更新 state。
const bannerReducer = (state = initailState , action) => {
switch(action.type){
default:
return state;
}

}

export default bannerReducer;


constant:定义一些常量**引入store:**

import React from ‘react’;
import ReactDOM from ‘react-dom/client’;
import App from ‘./App’;
import store from ‘./store’;
// 引用provider将store进行传递
import { Provider } from ‘react-redux’;
const root = ReactDOM.createRoot(document.getElementById(‘root’));
root.render(



);


为什么要使用中间件???因为reducer必须是纯函数,这意味着它不能直接处理异步操作,异步操作必须在action之后的中间件处理之后**生成原始的action,这样,reducer函数就能处理相应的action,从而改变state,更新UI。**thunk有什么缺点:- Redux Thunk 在处理异步操作时,通常需要编写大量的样板代码。
- Redux Thunk 将异步逻辑与 Redux 的 action 紧密耦合在一起。这意味着 action creator 不仅需要定义 action 类型,还需要处理异步逻辑。saga:引入:创建中间件,应用中间件,run中间件

import { configureStore } from ‘@reduxjs/toolkit’;
import createSagaMiddleware from ‘redux-saga’;
import mySaga from ‘./saga’;
import rootReducer from ‘./reducer’;
// 创建saga中间件
const sagaMiddleware = createSagaMiddleware();
// 定义store:reducer+中间件
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware().concat(sagaMiddleware)
});
// 使用中间件
sagaMiddleware.run(mySaga);

export default store;


saga.js中监听actionTyp然后执行逻辑代码

import {put, takeEvery} from ‘redux-saga/effects’
import axios from ‘axios’
import { FETCH_HOME_MULTIDATA } from ‘./constant’;
import { changeBannersAction } from ‘./actionCreator’;
// 定义异步函数:*
function* fetchHomeMultidata(){
const res = yield axios.get(‘http://123.207.32.32:8000/home/multidata’)
const banner = res.data.data.banner.list;
// 发送
yield put(changeBannersAction(banner))
}
// 监听
function* mySaga(){
yield takeEvery( FETCH_HOME_MULTIDATA, fetchHomeMultidata )
}

export default mySaga;

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

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

相关文章

OD 算法题 B卷【反转每对括号间的子串】

文章目录 反转每对括号间的子串 反转每对括号间的子串 给出一个字符串s&#xff0c; 仅含有小写英文字母和英文括号’(’ ‘)’&#xff1b;按照从括号内到外的顺序&#xff0c;逐层反转每对括号中的字符串&#xff0c;并返回最终的结果&#xff1b;结果中不能包含任何括号&am…

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…

详细讲解Flutter GetX的使用

Flutter GetX 框架详解&#xff1a;状态管理、路由与依赖注入 GetX 是 Flutter 生态中一款强大且轻量级的全功能框架&#xff0c;集成了状态管理、路由管理和依赖注入三大核心功能。其设计理念是简洁高效&#xff0c;通过最小的代码实现最大的功能&#xff0c;特别适合快速开发…

【大模型:知识库管理】--Dify接入RAGFlow 知识库

ragflow的官方文档&#xff1a; HTTP API 接口 |抹布流 --- HTTP API | RAGFlow 接着前文&#xff0c;我们已经创建了知识库&#xff0c;那么如何才能使用它呢&#xff1f; 当然也是通过网络API的形式去调用它。本文将讲解两种方式&#xff1a; Dify调用python源码调用 目录…

Vue 模板配置项深度解析

Vue 模板配置项深度解析 在 Vue 组件开发中&#xff0c;template 是定义组件视图结构的核心配置项。作为 Vue 专家&#xff0c;我将全面解析模板的各个方面&#xff0c;帮助你掌握高效构建 Vue 组件的艺术。 一、模板基础概念 1. 模板的本质 声明式渲染&#xff1a;描述 UI…

基于深度哈希与图索引的十亿级图像近重复检测系统

引言 在上一篇文章中,我们介绍了基于Vision API和SimHash的亿级图像去重方案。本文将更进一步,探讨如何应对十亿级图像库的近重复检测挑战,提出一种结合深度哈希学习与图索引的创新架构。该系统在多个关键指标上比传统方法提升显著: 检测精度提升:mAP@100达到0.92(传统方…

Python开发基础手语识别(基础框架版)

一、前期准备 想要实现这些&#xff0c;首先就是要模拟出来一个大致的框架&#xff0c;方便后续开展&#xff0c;下面的就是随便写的一个框架&#xff0c;大家凑合看看就行&#xff0c;基本上是这个意思&#xff1a; from tkinter import *w Tk() w.title("手语识别&am…

React从基础入门到高级实战:React 实战项目 - 项目一:在线待办事项应用

React 实战项目&#xff1a;在线待办事项应用 欢迎来到本 React 开发教程专栏的第 26 篇&#xff01;在之前的 25 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件、状态、路由和性能优化等核心知识。这一次&#xff0c;我们将通过一个…

1991-2024年上市公司个股换手率数据

1991-2024年上市公司个股换手率数据 1、时间&#xff1a;1991-2024年 2、来源&#xff1a;上海证券交易所和深圳证券交易所 3、指标&#xff1a;证券代码、交易年份、开始日期、截止日期、年换手率(流通股数)(%)、年换手率(总股数)(%)、日均换手率(流通股数)(%)、日均换手率…

RAID存储技术概述

1 数据存储架构 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划&#xff0c;涵盖存储系统的布局、数据存储策略等&#xff0c;它明确数据如何存储、管理与访问&#xff0c;为数据的安全、高效使用提供支撑。 1.1 存储系统 存储系统是计算机的重要组成部分之…

LRU 和 DiskLRU实现相册缓存器

我是写Linux后端的&#xff08;golang、c、py&#xff09;&#xff0c;后端缓存算法通常是指的是内存里面的lru、或diskqueue&#xff0c;都是独立使用。 很少有用内存lru与disklru结合的场景需求。近段时间研究android开发&#xff0c;里面有一些设计思想值得后端学习。 写这…

可视化预警:如何让生产风险预警更高效?

你有没有遇到过这种情况&#xff1f; 明明设备已经开始发热报警&#xff0c;但操作人员还在继续运行&#xff1b; 或者某个参数已经接近危险值&#xff0c;却没人注意到&#xff1b; 甚至问题早就埋下了隐患&#xff0c;只是当时没发现…… 这些情况的背后&#xff0c;其实都…

【MPC-C++】qpOASES 源码编译与链接,编译器设置细节

qpOASES 源码编译与链接 克隆源码 git clone https://github.com/coin-or/qpOASES.gitcd qpOASES mkdir build cd build接下来是构建&#xff0c;有一些细节。 查看 CMakeLists.txt&#xff0c;发现如果不显示指定 CMAKE_BUILD_TYPE 构建版本&#xff0c;会自动编译 Release…

【11408学习记录】考研数学攻坚:行列式本质、性质与计算全突破

行列式 数学线性代数一、对象&#xff08;元素&#xff09;&#xff1a;向量二、运算三、行列式3.1 第一种定义——行列式的本质定义3.2 行列式的性质性质1&#xff1a;行列互换&#xff0c;其值不变性质2&#xff1a;若行列式中某行&#xff08;列&#xff09;元素全为零&…

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…

小木的算法日记-线段树

&#x1f333; 线段树 &#xff08;Segment Tree&#xff09;&#xff1a;玩转区间作的终极利器 你好&#xff0c;未来的算法大师&#xff01; 想象一下&#xff0c;你正在处理一个巨大的数据集&#xff0c;比如某个电商网站一整天的用户点击流。老板突然问你&#xff1a;“下…

Day24 元组和OS模块

1、元组&#xff08;有序 不可变 可重复&#xff09; 管道工程中pipeline类接收的是一个包含多个小元组的列表作为输入。可以这样理解这个结构&#xff1a; &#xff08;1&#xff09; 列表 []: 定义了步骤执行的先后顺序。Pipeline 会按照列表中的顺序依次处理数据。之所以用列…

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…