前端学习系列(9):React进阶——深入组件通信与状态管理

前端进阶必修课:尚硅谷React全家桶实战教程全解析(附源码课件) 尚硅谷《JS库-React》完整版教程是一套从基础到实战的React进阶课程,涵盖React核心、组件化开发、脚手架实战、React-Router和Redux状态管理等核心技术。课程通过45节精讲视频,深入解析虚拟DOM原理、组件通信、路由配置等大厂面试高频考点,并提供评论管理系统等实战项目。适合不同水平开发者系统学习React全家桶,掌握工程化思维,突破中高级前端技术门槛。配套源码和课件帮助开发者从"会用API"进阶到"理解架构",是冲击大厂P6/P7岗位的优质学习 阅读详情

前端学习系列(9):React进阶——深入组件通信与状态管理

一、回顾与引入

上一期我们深入探索了Vue.js的进阶知识,学习了组件通信和状态管理。本期我们将聚焦React,进一步挖掘其在组件通信和状态管理方面的高级特性。在React应用逐渐复杂的情况下,掌握这些知识能帮助我们更好地构建可维护、高效的应用程序。

二、React中复杂的组件通信模式

2.1 使用Context进行跨层级通信

在React中,当组件层级较深,父子组件之间传递数据变得繁琐时,Context提供了一种在组件树中共享数据的方式,无需通过多层组件手动传递props。

首先,使用createContext创建一个Context对象:

import React from'react';

// 创建Context对象
const UserContext = React.createContext();

// 父组件
const ParentComponent = () => {
    const user = { name: 'Alice', age: 25 };
    return (
        <UserContext.Provider value={user}>
            <ChildComponent />
        </UserContext.Provider>
    );
};

// 子组件,可能在深层嵌套中
const ChildComponent = () => {
    const user = React.useContext(UserContext);
    return (
        <div>
            <p>姓名: {user.name}</p>
            <p>年龄: {user.age}</p>
        </div>
    );
};

export { ParentComponent };

在上述代码中,UserContext.Provider将user数据提供给其后代组件,ChildComponent通过useContext钩子函数获取Context中的数据。这种方式使得数据可以跨越多个组件层级进行传递,而无需在中间组件逐一传递props。

2.2 事件总线模式的实现

虽然React没有内置的事件总线,但我们可以自己实现一个简单的事件总线。通过创建一个全局的事件中心,各个组件可以在这个中心上发布和订阅事件。

创建一个EventBus.js文件:

const eventBus = {
    events: {},
    on(eventName, callback) {
        if (!this.events[eventName]) {
            this.events[eventName] = [];
        }
        this.events[eventName].push(callback);
    },
    emit(eventName, data) {
        if (this.events[eventName]) {
            this.events[eventName].forEach(callback => callback(data));
        }
    }
};

export default eventBus;

在组件中使用事件总线:

import React from'react';
import eventBus from './EventBus';

const ComponentA = () => {
    const sendMessage = () => {
        eventBus.emit('message - event', '来自ComponentA的消息');
    };
    return (
        <div>
            <button onClick={sendMessage}>发送消息</button>
        </div>
    );
};

const ComponentB = () => {
    React.useEffect(() => {
        const handleMessage = (message) => {
            console.log('ComponentB接收到消息:', message);
        };
        eventBus.on('message - event', handleMessage);
        return () => {
            eventBus.emit('message - event', handleMessage);
        };
    }, []);
    return <div>ComponentB等待接收消息</div>;
};

export { ComponentA, ComponentB };

在这个例子中,ComponentA通过eventBus.emit发布事件,ComponentB通过eventBus.on订阅事件并处理接收到的数据。注意在ComponentB中,使用useEffect钩子函数来进行事件订阅,并在组件卸载时取消订阅,以避免内存泄漏。

三、Redux状态管理库的基本原理和使用方法

3.1 Redux的核心概念

Redux是一个用于管理JavaScript应用状态的可预测状态容器。它遵循三大原则:

  • 单一数据源:整个应用的状态存储在一个单一的store对象中。
  • 状态是只读的:唯一改变状态的方法是触发action,action是一个描述发生了什么的普通JavaScript对象。
  • 使用纯函数来执行修改:reducer是一个纯函数,它接收当前状态和action,返回新的状态。

3.2 Redux的基本使用步骤

首先,安装Redux和React - Redux:

npm install redux react - redux

创建一个简单的计数器应用来展示Redux的使用:

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

export default counterReducer;
// store.js
import { createStore } from'redux';
import counterReducer from './counterReducer';

const store = createStore(counterReducer);

export default store;
// App.js
import React from'react';
import { Provider } from'react - redux';
import store from './store';
import CounterComponent from './CounterComponent';

const App = () => {
    return (
        <Provider store = {store}>
            <CounterComponent />
        </Provider>
    );
};

export default App;
// CounterComponent.js
import React from'react';
import { useSelector, useDispatch } from'react - redux';

const CounterComponent = () => {
    const count = useSelector(state => state.count);
    const dispatch = useDispatch();

    const increment = () => {
        dispatch({ type: 'INCREMENT' });
    };

    const decrement = () => {
        dispatch({ type: 'DECREMENT' });
    };

    return (
        <div>
            <p>计数: {count}</p>
            <button onClick={increment}>增加</button>
            <button onClick={decrement}>减少</button>
        </div>
    );
};

export default CounterComponent;

在上述代码中,counterReducer是一个reducer函数,根据不同的action来更新状态。store通过createStore创建,将reducer传入其中。Provider组件将store提供给整个应用,使得子组件可以通过useSelector和useDispatch来获取状态和分发action。

四、在React项目中结合Redux进行高效的状态管理和应用开发

4.1 构建复杂应用时Redux的优势

在大型React项目中,随着组件数量和业务逻辑的增加,状态管理变得复杂。Redux的单一数据源和可预测性使得状态变化易于追踪和调试。例如,在一个电商应用中,购物车状态、用户登录状态等都可以统一管理在Redux的store中。不同组件对这些状态的修改都通过action和reducer进行,保证了状态变化的一致性和可维护性。

4.2 与React Router结合实现动态数据加载

React Router用于处理路由,结合Redux可以在路由切换时动态加载数据。例如,在一个博客应用中,当用户切换到文章详情页面时,可以在路由组件中通过dispatch action来从服务器获取文章数据,并更新Redux store中的状态,然后组件根据更新后的状态进行渲染。

import React from'react';
import { BrowserRouter as Router, Routes, Route } from'react - router - dom';
import { useDispatch } from'react - redux';
import ArticleList from './ArticleList';
import ArticleDetail from './ArticleDetail';

const AppRouter = () => {
    const dispatch = useDispatch();

    const loadArticle = (articleId) => {
        // 这里可以发起异步请求获取文章数据
        // 然后dispatch action更新store
        dispatch({ type: 'FETCH_ARTICLE', payload: articleId });
    };

    return (
        <Router>
            <Routes>
                <Route path = "/" element={<ArticleList />} />
                <Route path = "/article/:id" element={<ArticleDetail loadArticle={loadArticle} />} />
            </Routes>
        </Router>
    );
};

export default AppRouter;

在ArticleDetail组件中,根据传入的loadArticle函数在组件挂载时获取文章数据:

import React, { useEffect } from'react';

const ArticleDetail = ({ loadArticle, match }) => {
    useEffect(() => {
        const articleId = match.params.id;
        loadArticle(articleId);
    }, [loadArticle, match]);

    return (
        <div>
            {/* 根据Redux store中的文章数据进行渲染 */}
        </div>
    );
};

export default ArticleDetail;

五、总结与下期预告

本期我们深入学习了React中的复杂组件通信模式以及Redux状态管理库的使用。通过这些知识,我们能够更好地处理React应用中的数据流动和状态管理。

下期预告
《Angular进阶:深入服务与路由》你将学到:

  • Angular服务的高级特性,如依赖注入的深入理解和使用
  • Angular路由的高级配置,包括路由守卫、嵌套路由等
  • 利用Angular服务和路由构建功能完备、安全可靠的单页应用程序

📢 系列提示:本系列持续更新中,建议点👍/收藏本篇文章,关注作者及时获取更新提醒。有任何问题欢迎评论区留言交流!

React状态管理之react-redux 众所周知,React中数据通信是单向的,即父组件可以通过props向子组件传递数据,而子组件却不能向父组件传递数据。要实现子组件向父组件传递数据的需求,需要父组件提供一个修改数据的方法,当页面越来越多的时候,数据的管理就会变得异常复杂。 并且,每次数据的更新都需要调用setState,特别是涉及到跨组件通信的问题就会很麻烦。在React开发中,为了解决跨组件通信的问题,业界开发了一大批状态管理框架,目前比较常用的React状态管理框架有Flux、Redux和Mobx等几个。 其中,Flux是Facebook 阅读详情

相关推荐

React入门学习指南:逐步构建前端应用

本文是针对《Beginning React》一书的读后感和总结。书中通过14个简短章节,从基础到项目实战,逐步引导读者理解并应用React开发Web应用。作者Nathan Sebhastian避免理论堆砌,而是重点教授React的核心概念和构建块,如JSX、组件、props、states、事件处理程序、hooks等,并在最后几章中带领读者构建向导表单和待办事项列表应用。

weixin_30021053的博客 891

React 全面入门与进阶实战教程

React是由Facebook开发的前端JavaScript库,采用组件化开发方式提升UI复用能力。本文介绍了React的核心特点、项目搭建方式、基础语法和组件通信方法。内容包括:使用Create React App和Vite初始化项目、JSX语法、组件状态管理(useState)、生命周期(useEffect)、父子组件通信(props和回调)、Context跨层通信、React Router路由配置。还涵盖了Redux Toolkit状态管理、性能优化技巧(React.memo、useCallback)

idree的博客 6748

STM32CubeMx+stm32f407+FreeRTOS+LAN8720实现LWIP以太网UDP TCP数据收发功能

单片机实现LWIP的调试

qq_40600203的博客 3070

React前端框架全面教程:从入门到进阶

React 是由 Facebook 开发并维护的一个开源JavaScript 库,用于构建用户界面。它的核心理念是组件化,允许开发者将 UI 拆分为独立的、可复用的部分,从而提高代码的可维护性和可读性。本文详细介绍了 React 的核心概念、环境搭建、组件创建、状态管理、组件通信、路由管理、表单处理、样式管理以及组件测试等内容。通过这些知识的学习和实践,你可以更高效地开发 React 应用。

荷塘月色 4016

【故障处理】- ORA-01722

在执行升级脚本@?/rdbms/admin/catupgrd.sql时报错ora-01722。

weixin_39099660的博客 855

避坑指南:用逐飞开源库驱动MT9V03X摄像头时容易忽略的3个细节(附TFT显示优化技巧)

本文详细解析了在智能汽车竞赛中使用MT9V03X摄像头(总钻风)时常见的硬件连接、图像采集和TFT显示优化问题。重点介绍了逐飞开源库中容易被忽略的三个关键细节,包括电源管理、看门狗设置和中断优先级配置,并提供了针对IPS200和TFT180显示屏的优化技巧,帮助参赛队伍提升图像处理效率和显示质量。

study的专栏 744

全方位分析Vue与React:现代前端框架深度比较

特性ReactVue设计目标构建大型复杂应用渐进式框架,适应各种规模数据流单向数据流双向数据绑定(可选)响应式原理需要手动优化(useMemo等)自动依赖追踪组件通信Props/回调/Context/状态管理库Props/事件/Provide-Inject/总线学习曲线较陡峭(需理解JSX、Hooks等)较平缓(模板更直观)灵活性高度灵活(JSX允许任意JS逻辑)灵活但有约束(模板限制少)核心库关注点只关注UI(路由等由社区提供)核心包含路由等常用功能。

百锦再的博客 1万+

从虚拟机到双系统:手把手教你为Gromacs搭建最强Linux环境(含WSL2、Ubuntu22.04配置)

本文详细指导如何在Windows系统下为Gromacs分子动力学模拟搭建高性能Linux环境,涵盖WSL2和Ubuntu22.04双系统配置。通过对比虚拟机、WSL2和原生Linux的性能数据,提供GPU加速、内存优化等实用技巧,帮助科研人员提升计算效率。

weixin_30861797的博客 270

React 多组件状态管理:从组件状态到全局状态管理全面指南

React 多组件状态管理:从组件状态到全局状态管理全面指南

chenNorthlittle的博客 1686

华为od 面试八股文_C语言_02_含答案

华为od 面试八股文_C语言_02_含答案

MISAYAONE的博客 2230

【DRAM存储器二】Sense Amplifier

详述DRAM颗粒中感应放大器功能、电路结构、工作原理和操作波形

highman110的博客 7201

【前端框架与库】「React 全面解析」:从 JSX 语法到高阶组件,深度剖析前端开发中的核心概念与最佳实践

在现代前端开发中,React 作为一个流行的 JavaScript 库,已经成为构建用户界面的首选框架。无论是小型项目还是大型复杂应用,React 都凭借其组件化结构、灵活性和高效性赢得了广泛的青睐。作为一个技术博主,我将带你深入了解 React 的核心概念和最佳实践,从基础的 JSX 语法到先进的性能优化技术,涵盖 React 的生命周期、组件设计模式、React Hooks、路由、虚拟 DOM 和状态管理等内容。

ZT_LJ的博客 3314

Flatten 层的深度理解与运用

Flatten 层的深度理解与运用

你要拥有一个你喜欢并且热爱的人生 7030

前端框架 React 学习总结

(1)创建store仓库,reducers分开管理reducers: 数据开发中type字符串应放入一个常量管理default:}}default:}}count,user}//1、引入redux//引入日志//导入reducers//2、创建仓库//合并多个reducer})(2)导入到src/index.js文件,全局配置(3)组件中的使用return (

qq_50909707的博客 1万+

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%)

效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1258

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

React组件通信(父传子,子传父) - 前端

父组件向子组件传值(通过props传值) 子组件: class Children extends Component{ constructor(props){ super(props); } render(){ return( <div>这是:{this.props.name}</div> // 这是 父向子 ) } } ...

Clearlight's Blog 4836

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

前端面试题之React篇

前端面试题之React篇一、组件基础1. React 事件机制2. React的事件和普通的HTML事件有什么不同?3. React 组件中怎么做事件代理?它的原理是什么?4. React 高阶组件、Render props、hooks 有什么区别,为什么要不断迭代5. 对React-Fiber的理解,它解决了什么问题?6. React.Component 和 React.PureComponent 的区别7. Component, Element, Instance 之间有什么区别和联系?8. React

爱是与世界平行 5946

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

揭秘ULEARN技术架构:Laravel后端与React前端的协同工作原理

ULEARN是一个基于Laravel 5.8后端和ReactJS 16.9前端构建的开源学习管理系统(LMS)。本文将深入剖析其技术架构,揭示Laravel与React如何协同工作,为开发者提供一个清晰的系统设计蓝图。 ## 整体架构概览 ULEARN采用现代化的前后端分离架构,后端使用Laravel提供API服务,前端通过React构建交互式用户界面。这种架构不仅提高了开发效率,还确保了系统

gitblog_01426的博客 377

视频教程-JavaScript - React经典教程系列-ReactJS

JavaScript - React经典教程系列 全栈开发工程师,现职于北京...

weixin_30969753的博客 441

react的组件的概念和使用

Table of Contents1. **组件的定义****函数组件****类组件**2. **组件的生命周期**3. **状态管理****类组件中的状态管理****函数组件中的状态管理**4. **组件之间的通信****通过 Props 传递数据****上下文(Context)**5. **组件的...

cnzzs的博客 903

React-Blog:深入解析基于React Hooks的前端架构设计

在当今前端开发领域,React Hooks已经成为构建现代Web应用的重要范式。React-Blog项目作为一个基于React Hooks的个人博客系统,展示了如何利用Hooks构建高效、可维护的前端架构。本文将深入探讨这个开源项目的架构设计,帮助开发者理解如何在实际项目中应用React Hooks的最佳实践。 ## 📋 项目概述与技术栈 React-Blog是一个前后端分离的个人博客系统,

gitblog_00524的博客 918

Airweave前端架构:React+TypeScript+ShadCN组件库深度解析

Airweave是一个革命性的AI知识搜索平台,其前端架构采用了现代化的React+TypeScript技术栈,并深度整合了ShadCN UI组件库。本文将深入解析这一架构的设计理念、核心组件和最佳实践,帮助开发者理解如何构建企业级的现代化Web应用。 ## 技术栈全景图 ```mermaid graph TD A[Airweave前端架构] --> B[构建工具层] A --...

gitblog_00545的博客 1001

BlueOcean前端技术栈深度剖析:React、Redux与现代前端工程化

BlueOcean是Jenkins的现代化CI/CD界面插件,通过React、Redux等现代前端技术栈为用户提供直观易用的持续集成体验。🎯 本文将深入解析其前端架构设计、状态管理方案和工程化实践,帮助开发者理解如何构建企业级前端应用。 ## 前端技术栈架构概览 BlueOcean采用**分层架构设计**,核心模块包括: - **blueocean-core-js**: 共享JavaScr

gitblog_00694的博客 840

React状态管理架构演进:render props模式在Hooks时代的现代化实践

在React生态系统中,状态管理始终是构建复杂应用的核心挑战。随着Hooks API的普及,函数组件和`useState`/`useReducer`已成为主流选择,但render props模式在某些场景下仍展现出独特的技术价值。react-values作为一个专注于通过render props处理状态的轻量级组件库,为现代React开发提供了组件化状态管理的新范式。 ## 技术架构分析:组件化

gitblog_01043的博客 849
上一篇: 前端学习系列(8):Vue.js进阶——组件通信与状态管理
下一篇: 前端学习系列(10):Angular进阶——深入服务与路由
DoYangTan
博客等级 码龄5年 1946粉丝 319原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值