Hooks使用useReducer、createContext 、useContext实现模块数据共享,类似全局状态管理但不推荐做全局管理

简介: 使用React的`useReducer`和`createContext`钩子实现模块间的数据共享,类似于全局状态管理,但不推荐用作全局状态管理。`useReducer`适用于复杂的状态逻辑,而`createContext`和`useContext`则用于跨组件传递数据。

useReducer

useState 的替代方案。它接收一个形如 (state, action) => newState 的 reducer,并返回当前的 state 以及与其配套的 dispatch 方法。(如果你熟悉 Redux 的话,就已经知道它如何工作了。)

基本使用:
const [state, dispatch] = useReducer(reducer, initialArg);

当然还有第三个参数,不经常用,不做赘述。
和其他的hooks(useState、useEffect、useSelector、useDispatch等等)一样,都是从react中解构出来,使用的时候我们只需要将action函数和初始state传入即可,这个时候useReducer会给我们返回一个数组元素,数组的第0项是我们最新的state,第1项是dispatch函数,我们只需要将我们的action标识传入,就可以改变state中的数据并且入react-rudex\redux一样,可以实现自动render()

action函数
const initialState = {
   count: 0};

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

这样就实现了状态的更新,而我们并没有使用useState这个hook,如果我们要更新的数据很多,我们完全可以使用一个dispatch来解决,而不是调用多个setXXXX来更新状态。也不用使用回调函数的形式来更新父级组件中的状态。useReducer适用于单个模块下,如果想使用useReducer来实现全局的状态,还是推荐使用创建全局状态管理的形式来解决。
Hooks使用createStore、Provider、useSelector、useDispatch实现connect功能

在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为你可以向子组件传递 dispatch 而不是回调函数 。

useReducer的状态也会和useState的状态一样,会一直持久化,不会在组件重新渲染时改变。

createContext && useContext

使用Context我们可以实现父组件向孙组件传递参数的问题,无论是属性还是callback。
也可以配合上面的useRecuder来实现孙组件更新父组件中state中的状态,只要孙组件拿到父组件中的dispatch就可以出发action,使父组件重新render。

首先我们可以选择再一个单独的js中创建一个Context

export const myName='六卿'
export const myCreateContext= React.createContext();

在父组件中引入这个js,使用解构赋值的形式拿到myName、myCreateContext:

import {
   myName,myCreateContext} from './xxx.js'

在render中使用:

<myCreateContext.Provider value={
   myName}>
      <子组件 />
</myCreateContext.Provider>

这个时候我们成功的将myName传入后代组件,无论是子组件还是孙组件;
在子组件或者孙组件中同样也引入xxx.js
在子组件或者孙组件中使用useContext这个hook来接收来自父组件中的数据;

const myName= useContext(myCreateContext);

这个时候我们就可以直接使用myName的值了。

useReducer && createContext

还是上面的例子,我们将value传入的值为我们在useReducer中返回的值,state、dispatch

 const [state, dispatch] = useReducer(reducer, initialState);
<myCreateContext.Provider value={
   {
   state,dispatch}}>
      <子组件 />
</myCreateContext.Provider>

这样在子组件或者孙组件中我们可以这样写:

const {
   state,dispatch}= useContext(myCreateContext);

这样我们就可以使用父组件中的state,以及我们可以触发父组件中的action来实现更改父组件中的数据。
上面的操作就实现了父孙组件的通信。
同样是上面的useReducer和context还是适用单个模块使用,不推荐这样形式实现全局数据共享。

其他文章

1.hooks实现toDoList
2.hooks实现左添右减
3.React实现添加多行输入框(点击一行增加一行)
4.React页面跳转取消上一个页面的所有请求
5.React配合axios请求拦截校验session,403跳转至登陆页面
6.Hooks使用createStore、Provider、useSelector、useDispatch实现connect功能

六卿

见贤思齐焉,见不贤内自省

个人见解,不对之处还请斧正。

目录
相关文章
|
7天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2453 13
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
3天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1494 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19268 29
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18821 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17514 13
Apache Paimon V0.9最新进展
|
5天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
332 11
|
1月前
|
存储 人工智能 前端开发
AI 网关零代码解决 AI 幻觉问题
本文主要介绍了 AI Agent 的背景,概念,探讨了 AI Agent 网关插件的使用方法,效果以及实现原理。
18696 17
|
2天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
2天前
|
SQL 监控 druid
Druid连接池学习
Druid学习笔记,使用Druid进行密码加密。参考文档:https://github.com/alibaba/druid
187 80