Redux 是一个用于 JavaScript 应用程序的状态管理库,通常与 React 或 React Native 配合使用,帮助管理应用的状态和数据流。其核心原理是通过集中式的“单一数据源”来管理应用状态,避免组件之间的“层层传递”状态和副作用。

Redux 的原理

  1. 单一数据源(Store)
    Redux 维护一个全局状态树(即 Store),所有组件都通过读取这个状态树来获取数据。应用中的所有状态(数据)都存储在这个单一的 store 中,这样可以保证应用状态的一致性。

  2. State 是只读的
    在 Redux 中,整个应用的状态是只读的,你不能直接修改状态。要改变状态,必须通过触发 action 来执行。

  3. Actions
    Action 是描述要发生什么的普通 JavaScript 对象,通常包含 type 字段(标识该 Action 的类型),可能还会包含其他数据(payload)。例如:

    {type: 'ADD_TODO',payload: 'Buy milk'
    }
    

    Actions 是 Redux 的唯一方式来改变 state。

  4. Reducers
    Reducer 是纯函数,用来指定如何根据不同的 action 来更新 state。它接收当前的 state 和 action,然后返回一个新的 state。Reducer 不会直接修改原始 state,而是返回一个新的对象,确保 Redux 的不可变性原则。

    const todosReducer = (state = [], action) => {switch (action.type) {case 'ADD_TODO':return [...state, action.payload];default:return state;}
    };
    
  5. Dispatch
    dispatch 是一个函数,允许你发送 Action 到 Redux store。这样就会触发相应的 Reducer 来更新 state。

  6. Store
    Store 是 Redux 中的核心,它保存了应用的状态,并允许你获取状态、发送 Action、以及订阅状态变化。通常,我们通过 createStore() 创建一个 store。

    import { createStore } from 'redux';
    const store = createStore(todosReducer);
    
  7. 订阅(Subscribe)
    组件可以通过订阅 store 来获取状态的更新,通常使用 store.subscribe() 方法。Redux 与 React 的集成通常通过 React-Redux 库来简化订阅和更新的过程。

什么时候使用 Redux 管理状态

Redux 主要适用于以下几种情况:

  1. 多个组件共享状态
    如果应用中的多个组件需要访问或修改相同的数据,Redux 可以有效地避免数据传递问题,确保所有组件共享的是一致的状态。

  2. 复杂的状态逻辑
    如果应用的状态逻辑复杂,包含很多状态之间的依赖关系,或者需要执行大量的异步操作,Redux 提供了清晰的结构来管理这些状态变更。

  3. 跨组件通信
    如果你有多个不直接相关的组件需要通信(例如,在某个组件中修改了数据,其他组件需要更新),使用 Redux 可以避免复杂的传递关系,简化跨组件通信。

  4. 调试和持久化
    Redux 的状态是不可变的,便于调试。你可以通过 Redux DevTools 查看应用状态的变化过程,还可以方便地在应用崩溃时恢复状态。

在 React Native 项目中使用 Redux

以下是如何在 React Native 项目中具体使用 Redux 的步骤:

1. 安装相关依赖

首先,安装 Redux 和 React-Redux:

npm install redux react-redux
2. 创建 Action 和 Reducer

创建 Action(例如:添加任务)

// actions/todoActions.js
export const addTodo = (text) => ({type: 'ADD_TODO',payload: text,
});

创建 Reducer

// reducers/todoReducer.js
const initialState = {todos: [],
};const todoReducer = (state = initialState, action) => {switch (action.type) {case 'ADD_TODO':return {...state,todos: [...state.todos, action.payload],};default:return state;}
};export default todoReducer;
3. 创建 Store
// store.js
import { createStore } from 'redux';
import todoReducer from './reducers/todoReducer';const store = createStore(todoReducer);export default store;
4. 使用 Provider 将 Store 注入到组件树
// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import TodoApp from './TodoApp';const App = () => {return (<Provider store={store}><TodoApp /></Provider>);
};export default App;
5. 使用 connect 从 Redux 中获取状态并派发 Action

在组件中,通过 connect 将 Redux 状态映射到组件的 props 中,并通过 dispatch 派发 Action。

// TodoApp.js
import React from 'react';
import { View, Text, TextInput, Button } from 'react-native';
import { connect } from 'react-redux';
import { addTodo } from './actions/todoActions';const TodoApp = ({ todos, addTodo }) => {const [text, setText] = React.useState('');const handleAddTodo = () => {addTodo(text);setText('');};return (<View><TextInputvalue={text}onChangeText={setText}placeholder="Add a new todo"/><Button title="Add Todo" onPress={handleAddTodo} />{todos.map((todo, index) => (<Text key={index}>{todo}</Text>))}</View>);
};const mapStateToProps = (state) => ({todos: state.todos,
});const mapDispatchToProps = {addTodo,
};export default connect(mapStateToProps, mapDispatchToProps)(TodoApp);

Redux小结

  • Redux 的核心原理是使用单一的数据源(Store),通过 actions 触发 state 更新,Reducers 负责如何更新 state,组件通过订阅 store 来获取和渲染数据。
  • 什么时候使用 Redux:当你的应用状态管理变得复杂,多个组件需要共享状态时,Redux 是一个很好的解决方案。
  • 在 React Native 中的使用:通过安装 reduxreact-redux,创建 Store,定义 Actions 和 Reducers,使用 Provider 注入 Store,最后在组件中通过 connect 获取和修改状态。

Redux 虽然提供了强大的状态管理能力,但对于一些简单的应用,可以选择其他更轻量的状态管理方式(比如 React 的 useStateuseReducer)。

推荐使用 Redux Toolkit

它是 Redux 官方发布的一个工具集,旨在简化 Redux 的使用。Redux Toolkit 提供了更简单、更高效的 API,使得我们可以更加轻松地实现 Redux 状态管理,同时避免了传统 Redux 中的样板代码。

为什么使用 Redux Toolkit?

  1. 简化配置
    Redux Toolkit 内置了 configureStore 函数,自动配置了 Redux DevTools 和 Redux 中间件,避免了手动配置的繁琐过程。

  2. 简化 Reducer 和 Action
    使用 createSlice 可以同时定义 Action 和 Reducer,减少了重复的代码。你不再需要手动编写 action type 和 action creators。

  3. 默认启用开发工具
    Redux Toolkit 默认启用了 Redux DevTools,方便你调试应用程序中的状态变化。

  4. 增强的 Immutability 检查
    Redux Toolkit 使用了 Immer 库,允许你直接修改 state,而不需要担心不小心修改原始对象的问题,避免了不可变性管理的麻烦。

如何在 React Native 中使用 Redux Toolkit?

以下是如何在 React Native 项目中使用 Redux Toolkit 的步骤:

1. 安装 Redux Toolkit 和 React-Redux
npm install @reduxjs/toolkit react-redux
2. 创建一个 Slice(包含 Actions 和 Reducer)
// features/todos/todoSlice.js
import { createSlice } from '@reduxjs/toolkit';const todoSlice = createSlice({name: 'todos',initialState: [],reducers: {addTodo: (state, action) => {state.push(action.payload);},removeTodo: (state, action) => {return state.filter(todo => todo !== action.payload);}}
});export const { addTodo, removeTodo } = todoSlice.actions;export default todoSlice.reducer;
3. 配置 Store
// store.js
import { configureStore } from '@reduxjs/toolkit';
import todoReducer from './features/todos/todoSlice';const store = configureStore({reducer: {todos: todoReducer}
});export default store;
4. 使用 Provider 包裹应用并传递 Store
// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import TodoApp from './TodoApp';const App = () => {return (<Provider store={store}><TodoApp /></Provider>);
};export default App;
5. 在组件中使用 Redux 状态和派发 Actions
// TodoApp.js
import React, { useState } from 'react';
import { View, Text, TextInput, Button } from 'react-native';
import { useDispatch, useSelector } from 'react-redux';
import { addTodo, removeTodo } from './features/todos/todoSlice';const TodoApp = () => {const [text, setText] = useState('');const todos = useSelector(state => state.todos);const dispatch = useDispatch();const handleAddTodo = () => {if (text.trim()) {dispatch(addTodo(text));setText('');}};const handleRemoveTodo = (todo) => {dispatch(removeTodo(todo));};return (<View><TextInputvalue={text}onChangeText={setText}placeholder="Add a new todo"/><Button title="Add Todo" onPress={handleAddTodo} />{todos.map((todo, index) => (<View key={index}><Text>{todo}</Text><Button title="Remove" onPress={() => handleRemoveTodo(todo)} /></View>))}</View>);
};export default TodoApp;

总结

  • Redux Toolkit 提供了比传统 Redux 更简洁和高效的 API,推荐在新项目中使用。
  • 它减少了大量的样板代码,同时增强了状态管理的可读性和易用性。
  • Redux Toolkit 包含了很多功能,如自动配置 store、简化 reducer、内置开发工具支持等,提升了开发体验。

因此,在现代 React 和 React Native 项目中,使用 Redux Toolkit 会让状态管理更加简洁和高效。

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

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

相关文章

[特殊字符] CentOS 7 离线安装 MySQL 5.7 实验

&#x1f427; CentOS 7 离线安装 MySQL 5.7 实验 针对企业无互联网环境的系统&#xff0c;设计了如何在 CentOS 7 系统中&#xff0c;使用一台可以联网的主机&#xff08;NodeA&#xff09;为另一台无法联网的主机&#xff08;NodeB&#xff09;安装 MySQL 5.7 数据库及其依赖…

Redis 概率型数据结构实战指南

1. 为什么要用「近似」&#xff1f; 随着业务量爆发式增长&#xff0c;精确统计 的内存或 CPU 成本可能难以接受。例如&#xff1a; 统计一天内 唯一 IP 数 —— 用 SET 精确去重&#xff0c;百万 IP→占用数百 MB。统计海量商品销量、实时计算 P99 延迟、获取 TOP-N 热门页面……

Android开发工程师:Linux一条find grep命令通关搜索内容与文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多关键词搜索&#xff1a;使用正则表达式 pattern1|pattern2 同时搜索多个关键词&#xff08;如 activity|class&#xff09;单…

深入理解浏览器解析机制和XSS向量编码

URL 编码 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------浏览器解析不了。 页面识别在url解码之前&#xff0c;在…

ThinkPHP8极简上手指南:开启高效开发之旅

目录一、环境搭建1.1 安装 PHP1.2 安装 Composer二、安装 ThinkPHP8三、目录结构解析四、第一个简单示例&#xff1a;Hello, ThinkPHP84.1 创建控制器4.2 编写控制器方法4.3 配置路由4.4 访问测试五、进阶示例&#xff1a;数据库查询5.1 配置数据库连接5.2 创建模型5.3 编写查询…

智能制造之物料详解

在制造业业务系统中&#xff0c;物料流转贯穿“需求→采购→入库→生产→成品→交付”全流程&#xff0c;各系统通过数据协同实现物料状态、位置、数量的精准追踪。以下按流转阶段拆解&#xff1a;一、需求发起与计划阶段&#xff08;CRM/ERP/PLM主导&#xff09;1. 需求源头…

Qt的安装和环境配置

QT开发环境的搭建&#xff0c;需要安装3个部分&#xff0c;C编译器、Qt SDK(SDK是软件开发工具包)、QT的集成开发环境(IDE)Qt的3种集成开发环境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要额外的配置&#xff0c;但是有一些bug…

解析MCUboot的实现原理和Image结构

目录 概述 1 MCUboot的功能 1.1 代码包结构 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交换 2.5 Image 尾部数据结构 3 交换区 3.1 单交换区 3.2 Multiple Image boot 3.3 Image交换 4 交换状态&#xff08;swap statu…

YOLOv8目标检测项目代码详解与习题

YOLOv8目标检测项目代码详解与习题一、项目代码详解该代码是基于 YOLOv8 和 OpenCV 实现的图像目标检测项目&#xff0c;核心功能是加载预训练的 YOLOv8 模型&#xff0c;对指定图像进行目标检测&#xff0c;然后可视化检测结果并保存或显示。以下是逐行解析&#xff1a;# -*- …

gradle关于dependency-management的使用

1、相关文档Spring官方文档&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction仓库版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 对接FreeSwitch

1.增加Maven依赖<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…

限流算法与实现

费曼学习法学习限流算法为什么要限流mysql插入600次/秒超过这个阈值&#xff0c;要么使用mysql集群、要么限流&#xff0c;防止宕机有哪些算法固定窗口就是个计数器&#xff0c;一秒内超过阈值&#xff0c;不允许访问缺点&#xff1a;不均匀&#xff0c;跨越临界点的一秒内&…

Android本地浏览PDF(Android PDF.js 简要学习手册)

环境 Min SDK: 21 依赖&#xff1a; implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1" implementation "androidx.webkit:webkit:1.12.0"权限&#xff1a; <uses-permission android:name"android.permission.INTERNE…

CVE-2022-41128

概述CVE-2022-41128 是 Microsoft Internet Explorer&#xff08;IE&#xff09;浏览器中 JavaScript 引擎&#xff08;JScript/Chakra&#xff09;的一个 0day 漏洞&#xff08;披露时无官方补丁&#xff09;&#xff0c;属于内存破坏类漏洞&#xff0c;可被用于远程代码执行&…

基于LSTM的时间序列到时间序列的回归模拟

获取项目源码点击文末名片项目背景与目标 本项目旨在开发一种基于长短期记忆网络&#xff08;LSTM&#xff09;的模型&#xff0c;用于时间序列到时间序列的回归模拟任务。通过处理多组不同来源的时间序列数据&#xff0c;本模型的目标是从给定的输入序列中预测相应的输出序列。…

Linux基础命令详解:从入门到精通

本文整理了Linux系统中最常用的基础命令&#xff0c;每个命令都配有详细说明和具体示例&#xff0c;帮助你快速掌握Linux操作技巧。文章中用的终端是XShell,系统是Centos&#x1f4c1; 1. ls - 列出目录&#xff08;文件夹&#xff09;内容 功能&#xff1a;显示当前目录下的文…

正点原子stm32F407学习笔记10——输入捕获实验

一、输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例&#xff0c;用一个简图来 说明输入捕获的原理&#xff0c;如图所示&#xff1a;假定定时器工作在向上计数模式&#xff0c;图中 t1到t2 时间&#xff0c;就是我们需要测量的高电平时间。测…

深入理解设计模式:状态模式(State Pattern)

在软件开发中&#xff0c;我们经常会遇到对象的行为随着其内部状态的变化而变化的情况。例如&#xff0c;一个订单可能处于"待支付"、"已支付"、"已发货"或"已完成"等不同状态&#xff0c;每个状态下订单的操作逻辑可能完全不同。如果…

企业级网络综合集成实践:VLAN、Trunk、STP、路由协议(OSPF/RIP)、PPP、服务管理(TELNET/FTP)与安全(ACL)

NE综合实验4 一、实验拓扑二、实验需求 按照图示配置IP地址。Sw7和sw8之间的直连链路配置链路聚合。公司内部业务网段为vlan10和vlan20&#xff0c;vlan10是市场部&#xff0c;vlan20是技术部&#xff0c;要求对vlan进行命名以便区分识别&#xff1b;pc10属于vlan10&#xff0c…

小架构step系列20:请求和响应的扩展点

1 概述通过上一篇了解请求和响应的流程&#xff0c;Spring在设计上留了不少扩展点。里面通过查找接口的方式获取的地方&#xff0c;都可以成为一种扩展点&#xff0c;因为只要实现这类接口就可以成为Spring加载的一部分。本文了解一下这些扩展点&#xff0c;方便后面进行扩展。…