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

react中 多个层级 组件数据同用 组件之间传值 usecontext useReducer

封装同用的context

// useCountContext.tsx

// useCountContext.tsx
import React, { createContext, useContext, useReducer, Dispatch, ReactNode } from "react";// 状态类型
interface State {open: boolean;
}// Action 类型
/*** changeOpen 调整组件显示隐藏状态*/
type Action =| { type: "changeOpen";payload: boolean }| { type: "decrement" }| { type: "set"; payload: number };// 初始状态
const initialState: State = { open: true};// reducer 函数
function reducer(state: State, action: Action): State {switch (action.type) {case "changeOpen":return { ...state,open: action.payload  };default:return state;}
}// 创建 Context
const CountStateContext = createContext<State | null>(null);
const CountDispatchContext = createContext<Dispatch<Action> | null>(null);// Provider 组件(局部用)
export const CountProvider = ({ children }: { children: ReactNode }) => {const [state, dispatch] = useReducer(reducer, initialState);return (<CountStateContext.Provider value={state}><CountDispatchContext.Provider value={dispatch}>{children}</CountDispatchContext.Provider></CountStateContext.Provider>);
};// 自定义 Hook
export const useCountState = () => {const context = useContext(CountStateContext);if (!context) throw new Error("useCountState 必须在 CountProvider 中使用");return context;
};export const useCountDispatch = () => {const context = useContext(CountDispatchContext);if (!context) throw new Error("useCountDispatch 必须在 CountProvider 中使用");return context;
};

使用目录机构

-- pages
---|----super/index.tsx
---|----super/view/index.tsx
---|----super/conmmont/modal.tsxsuper/index.tsx  使用这个context的顶层要引入import '@/App.css'
import { CountProvider } from '@/Context/SharedContext/Iindex'
import StocktakView from './viewData'//仓库管理
function Stocktaking(){return (<div><CountProvider><StocktakView></StocktakView></CountProvider></div>)
}export default Stocktaking----super/view/index.tsxconst { open } = useCountState();const dispatch = useCountDispatch();return (
<div  onclick={()=>{dispatch({ type: "changeOpen",payload:false })
}}>
当前状态 {open ?“打开”:“关闭”}
</div>)其他组件一样的方式使用 即可

要在组件内部包 Provider 后再用 Context Hook(无效)

把 包裹在组件外一层

或者重构成 StocktakingWrapper + Stocktaking

http://www.dtcms.com/a/297124.html

相关文章:

  • Gitee如何成为国内企业DevOps转型的首选平台?
  • 璞致 PZSDR-P101:ZYNQ7100+AD9361 架构软件无线电平台,重塑宽频信号处理范式
  • ERNIE-4.5-0.3B 实战指南:文心一言 4.5 开源模型的轻量化部署与效能跃升
  • 规则分配脚本
  • 初识JVM--从Java文件到机器指令
  • 中国开源Qwen3 Coder与Kimi K2哪个最适合编程
  • “磁”力全开:钕铁硼重塑现代科技生活
  • Linux 网络与 Vim 编辑器操作
  • 3D实景的概念、特点及应用场景
  • 从“人工眼”到‘智能眼’:EZ-Vision视觉系统如何重构生产线视觉检测精度?
  • AI与区块链融合:2025年的技术革命与投资机遇
  • C++与Hive、Spark、libhdfs、ACID交互技巧
  • Vue2下
  • VR 技术在污水处理领域的创新性应用探索​
  • C++ string:准 STL Container
  • 【03】C#入门到精通——C# 输出格式、内容拼接、if判断 、bool 表达式、函数封装调用
  • 【深度学习优化算法】09:Adadelta算法
  • MyBatis-Plus中使用BaseMapper实现基本CRUD
  • MinIO:云原生对象存储的终极指南
  • Qt 与 SQLite 嵌入式数据库开发
  • 云原生可观测-日志观测(Loki)最佳实践
  • SQLite中SQL的解析执行:Lemon与VDBE的作用解析
  • mac下 vscode 运行 c++无法弹出窗口
  • 云原生介绍
  • 云原生 —— K8s 容器编排系统
  • FunASR实时多人对话语音识别、分析、端点检测
  • SQLite Insert 语句详解
  • 视频质量检测效率提升28%!陌讯多模态融合方案在流媒体场景的技术实践
  • 低速信号设计之 SWD 篇
  • Windows-WSL-Docker端口开放