React复习全攻略:浅尝Redux的全局滋味

在这里插入图片描述

是什么?

Redux 是一个使用叫做 “action” 的事件来管理和更新应用状态的模式和工具库

  • 提供全局状态数据的单一仓库(对象树),管理应用的全局状态
  • 单一数据源,状态只读,状态修改只由纯函数完成

为什么用(特点)?

在这里插入图片描述

适用场景:

  • 多组件共用同一个 state 状态
  • 更新 state 的逻辑复杂度高
  • 多人协同开发,中型及以上的项目

常用的包:

Redux 常用涉及的包,主要是 ReduxRedux-ToolkitReact-ReduxRedux-Thunk,以及调试工具 Redux-Devtools-Extension

  • Redux:Redux 的核心包。它提供了创建 store、统一管理 reducer、绑定 action、中间件集成及管理等组件。
  • Redux-Toolkit:Redux 的工具包。提供一系列简单易用的 API 和工具,简化 Redux 的开发和代码质量。
  • React-Redux:是 Redux 的官方 React 绑定库。其目的是让 React 组件能够使用 Redux 状态管理。
  • Redux-Thunk中间件,用于处理异步操作。使 dispatch 可以接受函数,赋予其执行异步操作的能力。
  • Redux-Devtools-Extension:Redux 的调试工具。可以显示 Redux 存储中状态随时间变化的历史记录

三大核心概念

  • Action: 动作对象,包含两个属性。是改变 state 的唯一方法
    • type:必填,唯一性,String 类型,标识属性
    • data:可选,放数据用的。
    • 举例:{ type: 'TOGGLE_TODO', index: 1 }
  • Reducer:用于初始化状态、加工状态的纯函数。加工时,根据当前的 state 和 action,产生新的 state。
  • Store: 将 state、action、reducer 联系在一起的对象。可以将Store理解为全局的一个变量,且全局只有一个Store。

怎么用?

在 React 项目里面使用 Redux,必不可少要先安装 ReduxReact-Redux

npm install redux 
npm install react-redux

Redux 基本使用

使用 Redux 的核心 createStore 进行状态管理,这是最基本的方法。

现已被官方标记弃用,原因是Redux 4.2以后鼓励用户用户使用 Redux-Toolkit

但这并不影响我们对于它的了解,以及如何使用。

我们来举个例子,加减数字的功能

1. 首先,我们先建立一个 counter 的 reducer

// src/reducer/counter.js
const initialState = {count: 0,
};export default function counterReducer(state = initialState, action) {switch (action.type) {case 'INCREMENT':return {...state,count: state.count + 1,};case 'DECREMENT':return {...state,count: state.count - 1,};default:return state;}
}

2. 可创建多个 reducer,通过 combineReducers 方法集成一个 rootReducer

// src/reducer/index.js
import { combineReducers } from 'redux';
import counterReducer from './counter';export default combineReducers({counter: counterReducer,// ... 其他 reducer  
});  

3. 导入 rootReducer,再由 createStore 创建 store

// src/store/index.js
import { createStore } from 'redux';
import rootReducer from '../reducer';const store = createStore(rootReducer)export default store;

4. 最后在应用中集成 Redux Store

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import App from './App';
import store from './store';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);

5. 组件里使用

在上述,状态仓库通过 createStore,已经创建完毕。创建完了,我们就该去使用这个 store 了。

在这一小节,我们将通过 React-Redux ,useSelector 取值,useDispatch 发出动作去修改值,从而实现这个加减功能。

// src/App.jsx
import { useSelector, useDispatch } from 'react-redux';function App() {const { count } = useSelector((state) => state.counter)const dispatch = useDispatch();return (<div className="App"><p>Count: { count }</p><button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button><button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button></div>);
}export default App;

有没有觉得用一个全局状态变量,就得这么多步骤,太恶心了吧

这正是官方后续出了 Redux-Toolkit 的原因,那下面我们就用它

Redux-Toolkit 使用

首先,你需要安装它:

npm install @reduxjs/toolkit

1. createSlice 创建 reducer

还是一样,我们先创建一个名为 countreducer

// src/reducer/count.js
import { createSlice } from '@reduxjs/toolkit';const initialState = {count: 0,
};const counterSlice = createSlice({name: "counter",initialState,reducers: {increment(state) {state.count++;},decrement(state) {state.count--;}}
})export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

2. configureStore 创建 store

configureStore 有添加更多 reducer 的功能并创建 store,直接省去了合并 rootReducer 的步骤

// src/store/index.js
import { configureStore } from '@reduxjs/toolkit';  
import counterReducer from '../slice/counter';  const store = configureStore({  reducer: {  counter: counterReducer,  // 可以添加更多的 reducer  },  
});  export default store;

3. 应用中集成 Redux Store

和上一种方法一样,使用 React-Redux 的 Provider 组件,让组件能够有状态管理

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import App from './App';
import store from './store';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);

4. 组件里使用

组件里使用,和上一种方法也大差不差,主要是加了 action 的导入

// src/App.jsx
import { useSelector, useDispatch } from 'react-redux';
// 就加了这里
import { increment, decrement } from './reducer/counter'; function App() {const { count } = useSelector((state) => state.counter)const dispatch = useDispatch();return (<div className="App"><p>Count: {count}</p><button onClick={() => dispatch(increment())}>Increment</button><button onClick={() => dispatch(decrement())}>Decrement</button></div>);
}export default App;

Redux DevTools 调试

我们在上述编写完加减数字的功能后,可以下载 Redux DevTools 进行直观的展示,以加深对 Redux 的理解。

扩展插件,可通过网上应用商店获取,非常方便:
在这里插入图片描述

添加完毕后,在 React 页面中,F12 呼出开发调试工具,选 Redux 标签就能看到以下数据:
在这里插入图片描述

Redux-Thunk 使用

Redux-Thunk 是一个用于处理 Redux 中异步操作的中间件

在 Redux 中,reducers 应该是纯函数,只负责处理同步的状态变更,而 Redux-Thunk 则允许你派发一个返回函数的 action,这个函数可以执行异步操作,比如发起 API 请求,然后在异步操作完成后,再派发一个真正的 action 来更新 Redux 中的状态。

其作用

  • 处理异步操作:通过派发返回函数的 action,你可以执行诸如 API 请求等异步任务,并在任务完成后更新应用状态。
  • 控制流:Redux-Thunk 允许你在派发 action 时进行条件判断、流程控制等操作,从而更灵活地处理不同情况下的异步行为。

下面是一个简单的 Redux-Thunk 使用示例:

import { createStore, applyMiddleware } from 'redux';  
import thunk from 'redux-thunk';  
import rootReducer from './reducers';  // 创建一个Redux store,并应用redux-thunk中间件  
const store = createStore(rootReducer, applyMiddleware(thunk));  // 一个异步action创建函数  
function fetchPostsRequest() {  return {  type: 'FETCH_POSTS_REQUEST'  };  
}  function fetchPostsSuccess(posts) {  return {  type: 'FETCH_POSTS_SUCCESS',  payload: posts  };  
}  function fetchPostsError(error) {  return {  type: 'FETCH_POSTS_ERROR',  payload: error  };  
}  // 使用redux-thunk,我们可以派发一个返回函数的action  
export function fetchPosts() {  return function(dispatch) {  dispatch(fetchPostsRequest());  return fetch('https://api.example.com/posts')  .then(response => response.json())  .then(posts => dispatch(fetchPostsSuccess(posts)))  .catch(error => dispatch(fetchPostsError(error)));  };  
}

在这个示例中,fetchPosts是一个异步 action 创建函数,它返回一个函数。这个函数首先派发一个FETCH_POSTS_REQUEST action 来指示开始获取帖子,然后发起一个 API 请求。当请求成功时,它派发一个FETCH_POSTS_SUCCESS action 并带上获取到的帖子数据;如果请求失败,则派发一个FETCH_POSTS_ERROR action 并带上错误信息。

通过这种方式,你可以将异步逻辑与 Redux 的状态管理结合起来,实现更加健壮和可维护的应用。


结束语

在 React 的复习全攻略中,Redux 无疑是一个不可忽视的篇章。

浅尝 Redux 的全局滋味,我们不仅能领略到其集中式状态管理的魅力,更能感受到它如何助力 React 应用实现数据流的清晰可控

Redux 的出现,极大地简化了组件间的通信,让我们的代码更加整洁高效

掌握 Redux,不仅意味着我们能够更好地驾驭 React 应用的全局状态,更是提升我们开发能力的重要一步。

无论是初学者还是资深开发者,Redux 都是值得我们去深入学习和探索的领域~。

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

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

相关文章

关于游戏当中击退/击飞效果的制作

关于游戏当中击退/击飞效果的制作 在游戏当中我们免不了会有一些炫酷的效果&#xff0c;特别是RPG游戏&#xff0c;比如放一个技能&#xff0c;直接大范围杀伤&#xff0c;然后把敌人全部击飞或者击退&#xff0c;那效果真的很舒服。把自己想象成武林高手&#xff0c;一套江湖…

常用的深度学习自动标注软件

0. 简介 自动标注软件是一个非常节省人力资源的操作&#xff0c;而随着深度学习的发展&#xff0c;这些自动化标定软件也越来越多。本文章将会着重介绍其中比较经典的自动标注软件 1. AutoLabelImg AutoLabelImg 除了labelimg的初始功能外&#xff0c;额外包含十多种辅助标注…

五、书架开发--1.书架标题组件交互、获取书架数据

添加书架页面&#xff0c;做路由配置 首先添加书架页面&#xff0c;到views中的store中添加一个StoreShelf表示书架 然后到路由中进行注册 然后书城首页的返回键我们是想要点击返回的话就跳转到书架页面&#xff0c;所以如下this.$router.push(/store/shelf) 做书架标题组件 …

d3dcompiler_47.dll文件的缺失问题要怎么解决?四种修复d3dcompiler_47.dll的方法

d3dcompiler_47.dll文件的丢失&#xff0c;其实还是比较少见的&#xff0c;毕竟这个dll文件相对来说还是比较稳定的&#xff0c;他是一个固定软件的一个功能dll文件&#xff0c;不过既然这个d3dcompiler_47.dll丢失了&#xff0c;今天我们就来给大家详细的说一说吧。 一.d3dcom…

“人工智能+数字人”,让数字技术赋能多领域智能化管理、数字化服务

AI数字人结合了语音合成、语音识别、语义理解、图像处理、虚拟形象驱动等多项AI核心技术&#xff0c;可以实现导览服务、信息播报、互动交流、业务咨询等智能化功能。 如今&#xff0c;AI数字人逐渐被政务、文旅、展馆展厅、博物馆、数字会议、金融、校园等等领域多元化应用&am…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP&#xff08;International Conference on Parallel Processing&#xff09;即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行&#xff01;ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

git修改本地提交历史邮箱地址

1、Git&#xff08;Git&#xff09; 2、修改Git本地提交历史中的邮箱地址 使用 git rebase 命令进行交互式重置。 具体步骤如下&#xff1a;&#xff08;https://git-scm.com/docs/git-rebase&#xff09; 1、查看提交历史&#xff1a; 使用 git log 命令列出提交历史&#x…

fs.1.10 ON CENTOS7 dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 centos7 docker上编译安装fs.1.10的流程记录&#xff0c;本文使用dockerfile模式。 环境 docker engine&#xff1a;Version 24.0.6 centos docker&#xff1a;7 freeswitch&#xff1a;v1.10.7 dockerfile 创建空…

4月11号总结

java学习 一.io流 简介&#xff1a;io&#xff0c;i代表in&#xff0c;指的是输入&#xff0c;o代表输出。io流是用于处理输入和输出数据的机制。Java的io流主要分为字节流和字符流两种类型。这些流可以用于读取和写入不同类型的数据&#xff0c;如文本&#xff0c;图片&#…

【洛谷】P1216 数字三角形

import java.io.IOException; import java.util.Scanner;public class P1216_数字三角形_DP_原版 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[][] dp new int[n 1][n 1];int t;for (int i 1; i < n; i) {fo…

Ollama教程——兼容OpenAI API:高效利用兼容OpenAI的API进行AI项目开发

相关文章: Ollama教程——入门&#xff1a;开启本地大型语言模型开发之旅 Ollama教程——模型&#xff1a;如何将模型高效导入到ollama框架 Ollama教程——兼容OpenAI API&#xff1a;高效利用兼容OpenAI的API进行AI项目开发 Ollama教程——兼容OpenAI API&#xff1a;高效利用…

推荐一个大学生可以参加的榜单赛事|人工智能赛道

【榜单赛事】第十四届全国大学生计算机应用能力与数字素养大赛 - 人工智能产业应用赛道人工智能编程赛项 正在火热报名中 本赛道定位于人工智能产业应用和实践&#xff0c;把人工智能产业真实的技能要求、能力要求体现在竞赛内容设计当中&#xff0c;并在竞赛环节融入实战项目…

软考121-上午题-【软件工程】-敏捷方法

一、敏捷方法 敏捷开发的总体目标是通过“尽可能早地、持续地对有价值的软件的交付”使客户满意。通过在软件开发过程中加入灵活性&#xff0c;敏捷方法使用户能够在开发周期的后期增加或改变需求。 敏捷过程的典型方法有很多&#xff0c;每一种方法基于一套原则&#xff0c;这…

阻塞队列和基本实现

1. 什么是阻塞队列 阻塞队列,从名字上看,它首先应该是一个队列,满足先进先出的原则.其次,我们来理解一下"阻塞"这个词.我们之前其实见过这个词,在介绍线程的状态时,我们讲过有一种状态就是阻塞状态.所谓的"阻塞",也就是一种等待,需要其他的线程进行唤醒,在…

跟TED演讲学英文:The next grand challenge for AI by Jim Fan

The next grand challenge for AI Link: https://www.ted.com/talks/jim_fan_the_next_grand_challenge_for_ai? Speaker: Jim Fan Date: October 2023 文章目录 The next grand challenge for AIIntroductionVocabularyTranscriptSummary后记 Introduction Researcher Jim…

Terraform 语法配置

配置语法 Terraform 的配置文件都是以 .tf 为后缀Terraform 支持两种模式 HCL、JSON Provider 插件 providers 地址&#xff1a;Terraform Registry Terraform 通过 provider 管理基础设施&#xff0c;使用 provider 与云供应商 API 进行交互&#xff0c;每个 Provider 都包含…

多线程的学习

多线程编辑&#xff1a; 可以简单理解进程是一个软件 而线程就是一个软件中多个可以同时运行的功能 实现多线程的第一种方式&#xff1a;使用Thead类我们再自己创造一个类继承于这个类我们在对Thead方法进行重写&#xff0c;注意我们再重写的时候一定要加上Override这行 我犯下…

多线程回答的滚瓜烂熟,面试官问我虚线程了解吗?我说不太了解!

Java虚拟线程&#xff08;Virtual Threads&#xff09;标志着Java在并发编程领域的一次重大飞跃&#xff0c;特别是从Java 21版本开始。这项新技术的引入旨在克服传统多线程和线程池存在的挑战。 多线程和线程池 在Java中&#xff0c;传统的多线程编程依赖于Thread类或实现Ru…

2024 年“认证杯”数学中国数学建模网络挑战赛

题目 C题 云中的海盐 巴黎气候协定提出的目标是&#xff1a;在 2100 年前&#xff0c;把全球平均气温相对于工业 革命以前的气温升幅控制在不超过 2 摄氏度的水平&#xff0c;并为 1.5 摄氏度而努力。 但事实上&#xff0c;许多之前的研究已经指出&#xff0c;全球的碳排放以及…

主从数据同步原理

2.2.主从数据同步原理 2.2.1.全量同步 主从第一次建立连接时&#xff0c;会执行全量同步&#xff0c;将master节点的所有数据都拷贝给slave节点&#xff0c;流程&#xff1a; 这里有一个问题&#xff0c;master如何得知salve是第一次来连接呢&#xff1f;&#xff1f; 有几个…