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

React 中的 useContext 和 useReducer

1. useContext简介

用 createContext 创建上下文对象,传递全局变量,在底层任意一个子组件可使用 useContext 获取该上下文对象,同时获取里面定义的全局变量值,进行渲染。

解决问题:当组件嵌套层级过多时,传递属性不方便。

2. useContext代码示例

import React, { useContext } from "react"// 创建上下文
const UserContext = React.createContext({ name: '' })function App() {return (// 用上下文包裹父组件<UserContext.Provider value={{ name: 'Augus' }}><div><p>欢迎学习React后台课程</p><Parent /></div></UserContext.Provider>)
}function Parent() {return (<div><p><span>Parent</span></p><p><Child /></p></div>)
}function Child() {// 在子组件中进行消费const { name } = useContext(UserContext)return <span>Child:{name}</span>
}export default App

3. useReducer简介

useReducer 实际上是 useState 的升级版,都是用来存储和更新 state,只是应用的场景不一样。

一般情况下,我们使用 useState 就足够项目需要了,不多当遇到以下场景时,使用useReducer 会更好些 。

1. 状态逻辑复杂:当状态的更新逻辑比较复杂时,使用 useReducer 可以将这个逻辑封装在 reducer 函数中,使代码更加清晰易懂;

2. 多组件共享状态:当多组件需要共享一个状态时,可以将这个状态放在父组件,然后通过 useReducer 将状态和更新函数传递给子组件,从而实现状态共享;

3. 需要处理连续的多个状态更新:当需要连续处理多个状态更新时,使用 useReducer 可以帮助我们更好地管理状态的变化和更新;

4. useReducer代码示例

import { useReducer } from "react"const initialState = { count: 0 };function reducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:throw new Error();}
}function Counter() {const [state, dispatch] = useReducer(reducer, initialState);return (<>Count: {state.count}<button onClick={() => dispatch({ type: 'decrement' })}>-</button><button onClick={() => dispatch({ type: 'increment' })}>+</button></>);
}

5. useReducer的高级用法

import React, { useContext,useReducer} from "react"// 创建上下文
const UserContext = React.createContext({})function App() {const reducer = (state:string,action:{type:string,name:string})=>{switch(action.type){case 'update_name':return action.namedefault :return state}}const [name,dispatch] = useReducer(reducer,'Augus');return (// 用上下文包裹父组件<UserContext.Provider value={{ name,dispatch }}><div><p>欢迎学习React后台课程</p><Child1 /><Child2 /></div></UserContext.Provider>)
}function Child1(){const { dispatch }:any = useContext(UserContext);const handlick = ()=>{dispatch({type:'update_name',name:Math.random()+''})}return (<p><span>Child1</span><button onClick={handlick}></button></p>)
}function Child2(){const {name}:any = useContext(UserContext);return (<p><span>Child2:{name}</span></p>)
}export default App

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 搭建高可用OpenStack(Queen版)集群(六)之部署Neutron控制/网络节点集群
  • 【秋招突围】2024届校招-拼多多笔试题-第一套
  • rk3568 android12 hdmi、耳机、喇叭音频切换
  • k8s(六)---pod
  • 【Material-UI】Checkbox 组件中的 Label Placement 设置详解
  • 基于SpringBoot+Vue的校园失物招领系统(带1w+文档)
  • 【产品经理】产品经理的产出有哪些?产品方案解决方案有哪些?
  • 零基础5分钟上手谷歌云GCP核心云开发技能 - 搭建和维护高可用数据库集群
  • 【JavaScript】数组四大方法命名 得push pop shift unshift的原因 和功能
  • cookie与session的区别+springboot使用
  • i2c讲解以及zyqn中的使用
  • vue的diff算法的【双端比较】策略
  • C++中如果函数a的参数是class v,class z是v的子类,可否将z的对象当参数传给函数a,可以
  • SystemUI plugin 开发
  • 2024年中职语文统编教材线上培训答案
  • 11111111
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Docker: 容器互访的三种方式
  • eclipse(luna)创建web工程
  • es6要点
  • iOS 颜色设置看我就够了
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JS笔记四:作用域、变量(函数)提升
  • Python十分钟制作属于你自己的个性logo
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue中实现单选
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 从零开始在ubuntu上搭建node开发环境
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端自动化解决方案
  • 区块链技术特点之去中心化特性
  • 区块链将重新定义世界
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微服务核心架构梳理
  • 一些关于Rust在2019年的思考
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ionic异常记录
  • #、%和$符号在OGNL表达式中经常出现
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (九)One-Wire总线-DS18B20
  • (一)插入排序
  • (转)Google的Objective-C编码规范
  • ***监测系统的构建(chkrootkit )
  • .net 7和core版 SignalR
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • @Controller和@RestController的区别?
  • @RequestBody与@RequestParam
  • [\u4e00-\u9fa5] //匹配中文字符
  • [20161214]如何确定dbid.txt
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码