react18 之 06 之 useReducer 结合 useContext使用 (实现全局状态管理、复杂组件交互逻辑、多个组件需要共享和更新某个状态)

目录

  • react18 之 06 之 useReducer 结合 useContext使用 (实现全局状态管理、复杂组件交互逻辑、多个组件需要共享和更新某个状态)
    • useReducer 结合 useContext使用 实现全局共享
      • RootCom.jsx
      • A.jsx
      • ASon.jsx
      • B.jsx
      • C.jsx
      • 执行效果

react18 之 06 之 useReducer 结合 useContext使用 (实现全局状态管理、复杂组件交互逻辑、多个组件需要共享和更新某个状态)

  • 作用
      1. 全局状态管理:使用 useReducer 结合 useContext 来实现全局状态管理,避免了 props 的层层传递。
      1. 复杂的组件交互逻辑:当组件之间的交互逻辑较为复杂,包含多个状态和操作时,使用 useReducer 结合 useContext 可以更好地组织和管理这些状态和操作,使代码更清晰易维护。
      1. 状态共享和更新:当你需要在多个组件中共享某个状态,并且这些组件可能需要对该状态进行更新时,可以使用 useReducer 结合 useContext 来提供状态和更新函数,让组件可以访问和更新共享的状态。

useReducer 结合 useContext使用 实现全局共享

RootCom.jsx

import React, { useReducer } from 'react';
import A from "./A";
import B from "./B";
import C from "./C";
import { GlobalContext } from './globalContext';
const initState = {count:1
}
function reducer(state,action) {// console.log('state,action',state,action);switch(action.type){case 'add': {return {...state,count: state.count + action.count}}case 'sub': {return {...state,count: state.count - action.count}}case 'mul': {return {...state,count: state.count * action.count}}default: {throw Error('Unknown action: ' + action.type);}}
}
export default function Rootcom() {const [state, dispatch] = useReducer(reducer, initState);const { count } = statereturn (// 使用 useContext创建的上下文 向下传递 state数据 和 修改light的方法dispatch(可以同步修改state数据实现爷子孙组件渲染最新的state的数据 )<GlobalContext.Provider value={{state,dispatch}} ><div><div>root组件 count - {count}</div><A></A><B></B><C></C></div></GlobalContext.Provider>)
}

A.jsx

import React, { useContext } from 'react';
import ASon from "./ASon";
import { GlobalContext } from './globalContext';
export default function A(props) {const { state,dispatch } = useContext(GlobalContext)function addCount(){dispatch({type:'add',count:2})}return (<div style={{marginTop:'10px'}}>A count - {state.count} <button onClick={addCount}>A组件count+2</button><ASon></ASon></div>)
}

ASon.jsx

import React, { useContext } from 'react';
import { GlobalContext } from './globalContext';
export default function ASon(props) {const { state,dispatch } = useContext(GlobalContext)function addCount(){dispatch({type:'add',count:1})}return (<div style={{marginTop:'10px'}}>ASon count - {state.count} <button onClick={addCount}>ASon组件count+1</button></div>)
}

B.jsx

import React, { useContext } from 'react';
import { GlobalContext } from './globalContext';
export default function B(props) {const { state,dispatch } = useContext(GlobalContext)function subCount(){dispatch({type:'sub',count:1})}return (<div style={{marginTop:'10px'}}>B count-{state.count} <button onClick={subCount}>B组件count-1</button></div>)
}

C.jsx

import React, { useContext } from 'react';
import { GlobalContext } from './globalContext';
export default function C() {const { state,dispatch } = useContext(GlobalContext)function cmulCount(){dispatch({type:'mul',count: 2})}return (<div style={{marginTop:'10px'}}>C count - {state.count} <button onClick={cmulCount}>C组件count * 2</button></div>)
}

执行效果

在这里插入图片描述

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

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

相关文章

【Excel】记录Match和Index函数的用法

最近一直用到的两个处理EXCEL表格数据的函数向大家介绍一下&#xff0c;写这篇博文的目的也是为了记录免得自己忘记了&#xff0c;嘻嘻。 先上百度的链接 Match函数的用法介绍&#xff1a;https://jingyan.baidu.com/article/2fb0ba40b4933941f3ec5f71.html 小结&#xff1a;…

【云原生持续交付和自动化测试】5.2 自动化测试和集成测试

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;【容器化应用程序设计和开发】 第三章&#xff1a;【基于容器的部署、管理和扩展】 第四章&#xff1a;【微服务架构设计和实现】 第五章&#xff1a;【5.1 自动化构建和打包容器镜像】 5…

【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

「从零入门推荐系统」22:chatGPT、大模型在推荐系统中的应用

作者 | gongyouliu 编辑 | gongyouliu 提示&#xff1a;全文2.5万字&#xff0c;预计阅读时长2小时&#xff0c;可以先收藏再慢慢阅读。 我们在上一章介绍了chatGPT、大模型的基本概念、核心技术原理等基础知识&#xff0c;有了这些背景知识的铺垫&#xff0c;下面我们来介绍ch…

Laravel 框架安装路由和控制器 ①

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

【Shell】基础语法(一)

文章目录 一、shell的介绍二、执行脚本三、shell的基本语法1. 变量的使用2. 变量的分类 一、shell的介绍 Shell的作用是解释执行用户的命令&#xff0c;用户输入一条命令&#xff0c;Shell就解释执行一条&#xff0c;这种方式称为交互式&#xff08;Interactive&#xff09;&a…

介绍Sping Boot的5个扩展点

1、初始化器ApplicationContextInitializer 我们在启动Spring Boot项目的时候&#xff0c;是执行这样一个方法来启动的 我们一层一层往下点&#xff0c;最终发现执行的是这个方法 所以我们在启动项目的时候也可以这样启动 new SpringApplication(SpringbootExtensionPointAp…

ubuntu22安装如何安装window软件(.exe)

ubuntu未提供相应程序安装包&#xff0c;如何使用的ubuntu22.04 安装window提供的exe程序呢&#xff1f; 这里我了解有两种方案&#xff1a; 使用模拟器进行window程序的运行&#xff0c;但是肯定会有相应的性能损耗如&#xff08;wine&#xff09;在linux上运行virtualbox或…

React Native获取手机屏幕宽高(Dimensions)

import { Dimensions } from react-nativeconsole.log(Dimensions, Dimensions.get(window)) 参考链接&#xff1a; https://www.reactnative.cn/docs/next/dimensions#%E6%96%B9%E6%B3%95 https://chat.xutongbao.top/

嵌入式开发学习(STC51-7-矩阵按键)

内容 按下S1-S16键&#xff0c;对应数码管最左边显示0-F 矩阵按键简介 独立按键与单片机连接时&#xff0c;每一个按键都需要单片机的一个I/O 口&#xff0c;若某单片机系统需较多按键&#xff0c;如果用独立按键便会占用过多的I/O口资源&#xff1b;而单片机 系统中I/O口资…

Flutter运行app时向logcat输出当前打开的界面路径且点击可跳转

当一个项目大了目录文件多了&#xff0c;我们往往会为了找到一个文件花费大量的时间和精力&#xff0c;为了快捷方便的调试我们的项目&#xff0c;我们往往需要在打开app运行的时候需要知道当前打开的界面的文件在哪儿&#xff0c;我们这个代码就能快捷的知道我们app正在打开的…

redis安装(Windows+Linux)

redis安装 文章目录 redis安装一. windows下安装二.Linux环境下安装 一. windows下安装 下载地址(github): https://github.com/tporadowski/redis/releases (强烈推荐) https://github.com/MicrosoftArchive/redis/releases 选择安装包 下载完成后根据提示进行安装即可(这…