当前位置: 首页 > 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.lryc.cn/news/599141.html

相关文章:

  • 滚动提示组件
  • MinIO:云原生对象存储的终极指南
  • GPU服务器与PC 集群(PC农场):科技算力双子星
  • 【PZ-KU060-KFB】——Kintex UltraScale 纯 FPGA 开发平台,释放高速并行计算潜能,高性价比的 FPGA 解决方案
  • 缓存HDC内容用于后续Direct2D绘制.
  • 云原生介绍
  • 云原生可观测-日志观测(Loki)最佳实践
  • 云原生 —— K8s 容器编排系统
  • iOS 日志查看实战指南,如何全面获取与分析 App 和系统日志
  • 单片机(STM32-ADC模数转换器)
  • 清理DNS缓存
  • 【物联网】基于树莓派的物联网开发【17】——物联网通信协议MQTT基础知识
  • 图论:并查集
  • 璞致 PZSDR-P101:ZYNQ7100+AD9361 架构软件无线电平台,重塑宽频信号处理范式
  • 图论:最小生成树
  • OneCode3.0 Gallery 组件前后端映射机制:从注解配置到前端渲染的完整链路
  • js基础概念-1
  • Mysql 日志 binlog redolog
  • onenav部署教程
  • 【氮化镓】GaN取代GaAs作为空间激光无线能量传输光伏转换器材料
  • 顺应AI浪潮,电科金仓数据库再创辉煌
  • Gitee如何成为国内企业DevOps转型的首选平台?
  • springboot(3.4.8)整合mybatis
  • 机器学习(一)KNN,K近邻算法(K-Nearest Neighbors)
  • 进程控制->进程替换(Linux)
  • 【深度学习优化算法】09:Adadelta算法
  • RocketMQ5.3.1的安装
  • AI小智源码分析——音频部分(一)
  • 医疗数据挖掘Python机器学习案例
  • 【办公类-107-03】20250725通义万相2.1“动物拟人化”视频,优化关键词(图片转视频MP4转gif))