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

React--Redux

Redux 是一个用于 JavaScript 应用的状态管理库,特别是在 React 应用中非常流行。下面我将详细介绍一个使用 Redux 的简单案例,包括设置 Redux 环境、创建 store、定义 actions 和 reducers,以及如何连接 React 组件。

步骤 1: 安装依赖

首先,确保你已经安装了 Node.js 和 npm。然后,使用以下命令安装 Redux 和 React-Redux:

npm install redux react-redux

步骤 2: 设置 Redux

创建 Action

Actions 是描述要发生什么的普通对象,通常包含一个 type 字段和可能的其他数据字段。

// src/actions/counterActions.jsexport const increment = () => ({type: 'INCREMENT'
});export const decrement = () => ({type: 'DECREMENT'
});export const reset = () => ({type: 'RESET'
});
创建 Reducer 

Reducers 是一个纯函数,接收当前状态和 action,并返回新的状态。

// src/reducers/counterReducer.jsconst initialState = {count: 0
};const counterReducer = (state = initialState, action) => {switch (action.type) {case 'INCREMENT':return { ...state, count: state.count + 1 };case 'DECREMENT':return { ...state, count: state.count - 1 };case 'RESET':return { ...state, count: 0 };default:return state;}
};export default counterReducer;
创建 Store

Store 是 Redux 的核心,保存应用的状态,并提供 dispatch 方法来发送 actions。

// src/store.jsimport { createStore } from 'redux';
import counterReducer from './reducers/counterReducer';const store = createStore(counterReducer);export default store;

步骤 3: 连接 React 和 Redux

提供 Store

使用 Provider 组件将 Redux store 传递到应用的组件树中。

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

在 React 组件中,使用 connect 函数将 Redux store 的 state 和 dispatch 方法映射到组件的 props 上。

// src/App.jsimport React from 'react';
import { connect } from 'react-redux';
import { increment, decrement, reset } from './actions/counterActions';const App = ({ count, increment, decrement, reset }) => {return (<div><h1>Counter: {count}</h1><button onClick={increment}>Increment</button><button onClick={decrement}>Decrement</button><button onClick={reset}>Reset</button></div>);
};// mapStateToProps 函数,映射 state 到组件的 props
const mapStateToProps = state => ({count: state.count
});// mapDispatchToProps 函数,映射 dispatch 到组件的 props
const mapDispatchToProps = {increment,decrement,reset
};export default connect(mapStateToProps, mapDispatchToProps)(App);

 关系规则

Redux 核心概念

  1. Store

    • Redux 的核心,保存应用的整个状态树。
    • 唯一的状态源,不能直接修改,需通过 action 分发来改变状态。
  2. Action

    • 描述发生了什么的普通 JavaScript 对象。
    • 必须包含 type 字段,表示 action 的类型。
  3. Reducer

    • 纯函数,接收当前状态和 action,并返回新的状态。
    • 根据 action 的类型决定如何更新状态。
  4. Dispatch

    • Store 的方法,用于发送 action,触发 state 变化。
  5. Connect

    • React-Redux 提供的函数,将 React 组件与 Redux store 连接起来。
    • 将 state 和 dispatch 映射到组件的 props 上。

 

                  +------------+|  Store     |+------+-----+|| dispatch(action)|+------v-----+|  Reducer   |+------+-----+|| new state|+------v-----+|  Component |+------------+

步骤详解

  1. 创建 Action

    • Action 是一个描述要发生什么的对象,有一个必需的 type 字段。
// actions/counterActions.js
export const increment = () => ({type: 'INCREMENT'
});export const decrement = () => ({type: 'DECREMENT'
});export const reset = () => ({type: 'RESET'
});

定义 Reducer: 

  • Reducer 是一个纯函数,接收当前状态和 action,并返回新的状态。
// reducers/counterReducer.js
const initialState = {count: 0
};const counterReducer = (state = initialState, action) => {switch (action.type) {case 'INCREMENT':return { ...state, count: state.count + 1 };case 'DECREMENT':return { ...state, count: state.count - 1 };case 'RESET':return { ...state, count: 0 };default:return state;}
};export default counterReducer;

创建 Store

  • Store 是应用的状态容器,包含应用的状态和 dispatch 方法
// store.js
import { createStore } from 'redux';
import counterReducer from './reducers/counterReducer';const store = createStore(counterReducer);export default store;

提供 Store 给应用

  • 使用 Provider 组件将 Redux store 传递给组件树中的每个组件。
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);

连接 React 组件与 Redux

  • 使用 connect 函数将 Redux state 和 dispatch 方法映射到组件的 props 上。
// App.js
import React from 'react';
import { connect } from 'react-redux';
import { increment, decrement, reset } from './actions/counterActions';const App = ({ count, increment, decrement, reset }) => {return (<div><h1>Counter: {count}</h1><button onClick={increment}>Increment</button><button onClick={decrement}>Decrement</button><button onClick={reset}>Reset</button></div>);
};const mapStateToProps = state => ({count: state.count
});const mapDispatchToProps = {increment,decrement,reset
};export default connect(mapStateToProps, mapDispatchToProps)(App);

数据流动过程

  1. 用户交互

    • 用户在组件中点击按钮(例如,点击 "Increment" 按钮)。
  2. 派发 Action

    • increment 函数被调用,返回一个 action 对象 { type: 'INCREMENT' },并通过 dispatch 方法派发这个 action。
  3. Reducer 处理 Action

    • Store 收到这个 action,并将其传递给 reducer。
    • Reducer 检查 action 的类型(INCREMENT),并根据逻辑返回新的 state。
  4. 更新 Store

    • Store 根据 reducer 返回的新 state 更新其内部的 state。
  5. 组件重新渲染

    • connect 函数确保组件接收到最新的 state 并重新渲染。

这样,整个数据流从组件到 store 再回到组件,形成一个单向数据流。这种模式确保了数据的可预测性和可维护性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多维时序 | Transformer+BiLSTM多变量时间序列预测(Python)
  • HAL库源码移植与使用之RTC时钟
  • 时间和空间复杂度
  • Docker、containerd、CRI-O 和 runc 之间的区别
  • 第1关 -- Linux 基础知识
  • AV1技术学习:Transform Coding
  • LeetCode:x的平方根(C语言)
  • Android 自定义系统版本号
  • 数学建模(5)——逻辑回归
  • 『大模型笔记』LLM秘密:温度、Top-K和Top-P抽样技术解析!
  • 服务器相关总结
  • 2024 中国大数据交易平台发展现状调研简报
  • Leetcode3208. 交替组 II
  • 逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack
  • Qwen-Agent
  • ----------
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Consul Config 使用Git做版本控制的实现
  • dva中组件的懒加载
  • ES6语法详解(一)
  • extjs4学习之配置
  • JavaScript对象详解
  • Javascript设计模式学习之Observer(观察者)模式
  • JavaWeb(学习笔记二)
  • laravel5.5 视图共享数据
  • log4j2输出到kafka
  • PAT A1017 优先队列
  • Vue 2.3、2.4 知识点小结
  • vue-loader 源码解析系列之 selector
  • Web标准制定过程
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 每天10道Java面试题,跟我走,offer有!
  • 如何进阶一名有竞争力的程序员?
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 事件委托的小应用
  • 小程序button引导用户授权
  • 云大使推广中的常见热门问题
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​第20课 在Android Native开发中加入新的C++类
  • (07)Hive——窗口函数详解
  • (4.10~4.16)
  • (C语言)fread与fwrite详解
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (十一)图像的罗伯特梯度锐化
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)visual stdio 书签功能介绍
  • (转)四层和七层负载均衡的区别
  • (自用)仿写程序
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***原理与防范
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .FileZilla的使用和主动模式被动模式介绍
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划