news 2026/3/11 21:45:31

React 组件通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
React 组件通信

React组件通信方式总结:1)父传子通过props单向传递数据,子组件不能直接修改;2)子传父通过回调函数实现数据传递;3)兄弟组件通过状态提升到共同父组件实现通信;4)跨层组件可使用Context机制,通过Provider提供数据,useContext获取;5)复杂应用推荐Redux集中状态管理,通过createSlice创建reducer,Provider注入store,useSelector和useDispatch操作状态。Redux Toolkit简化了Redux使用流程,支持同步/异步操作。

  1. 父传子
    父组件通过 props 传递数据给子组件,子组件通过 props 接收数据。
    props 可以传递任意类型的数据,包括字符串、布尔值、函数、对象、数组、JSX 等。
// 父组件functionParent(){const[value,setValue]=useState("父组件传递的数据");return(<div><Child value={value}/></div>);}// 子组件functionChild(props:{value:string}){return<div>{props.value}</div>;}

props 是只读的,不能直接修改,父组件的数据只能由父组件修改。

props children

// 父组件 标签嵌套<Son><span>我是span标签</span></Son>;// 子组件 通过props.children渲染在页面中functionSon(props:{children:React.ReactNode}){return(<div><h1>我是子组件</h1><hr/>{props.children}</div>);}
  1. 子传父

子组件通过 props 传递数据给父组件,父组件通过 props 接收数据,并传递给子组件。

// 父组件functionParent(){const[value,setValue]=useState("");consthandleChildChange=(value:string)=>{setValue(value);};return(<div><Child onChange={handleChildChange}/><p>{value}</p></div>);}// 子组件functionChild(props:{onChange:(value:string)=>void}){const[value,setValue]=useState("");consthandleChange=(e:React.ChangeEvent<HTMLInputElement>)=>{setValue(e.target.value);props.onChange(e.target.value);};return(<div><input type="text"value={value}onChange={handleChange}/></div>);}
  1. 兄弟组件

使用状态提升实现兄弟组件通信,即通过共同的父组件传递

// 父组件functionParent(){const[value,setValue]=useState("");consthandleChildChange=(value:string)=>{setValue(value);};return(<div><Child1 onChange={handleChildChange}/><Child2 value={value}/></div>);}// 子组件1functionChild1(props:{onChange:(value:string)=>void}){const[value,setValue]=useState("");consthandleChange=(e:React.ChangeEvent<HTMLInputElement>)=>{setValue(e.target.value);props.onChange(e.target.value);};return(<div><input type="text"value={value}onChange={handleChange}/></div>);}// 子组件2functionChild2(props:{value:string}){return(<div><p>{props.value}</p></div>);}
  1. 跨层组件通信——Context 机制
// 1. 创建ContextconstMyContext=createContext();// 2. 顶层组件通过Provider组件提供数据functionParent(){const[value,setValue]=useState("");consthandleChildChange=(value:string)=>{setValue(value);};return(<MyContext.Provider value={value}><Child1 onChange={handleChildChange}/><Child2/></MyContext.Provider>);}// 3. 子组件通过useContext钩子获取数据functionChild2(){constvalue=useContext(MyContext);return(<div><p>{value}</p></div>);}
  1. 跨层组件通信——Redux 机制 (集中状态管理工具)
// 1. 安装// Redux Toolkit:是一套工具集,用于简化 Redux 的书写方式// react-redux:链接React和Redux的中间件npm i @reduxjs/toolkit react-redux// 2. 创建slice store/modules/counterStore.jsimport{createSlice}from"@reduxjs/toolkit";importaxiosfrom"axios";constcounterSlice=createSlice({name:"counter",// 命名空间// 初始化状态initialState:{count:0},// 定义修改状态的方法 同步方法 支持直接修改reducers:{increment(state){state.count++;},decrement(state){state.count--;},// 支持传递参数 传递的参数会作为action.payload payload:固定的属性名addToNum(state,action){state.count+=action.payload},},});constchannelSlice=createSlice({name:"channel",initialState:{channelList:[]},reducers:{// 获取异步数据setChannel(state,action){state.channelList=action.payload}}})// 解构actioncCreater函数const{increment,decrement,addToNum}=counterSlice.actions;const{setChannel}=channelSlice.actions;// 发起异步请求constgetChannelList=()=>{returnasync(dispatch)=>{constres=awaitaxios.get("http://localhost:3000/channel");dispatch(setChannel(res.data))}}constcountReducer=counterSlice.reducer;constchannelReducer=channelSlice.reducer;// 导出方法export{increment,decrement,addToNum,getChannelList};exportdefaultcountReducer;exportdefaultchannelReducer;// 3. 创建store store/index.jsimport{configureStore}from"@reduxjs/toolkit";importcounterReducerfrom"./counterSlice";importchannelReducerfrom"./channelSlice";conststore=configureStore({reducer:{counter:counterReducer,channel:channelReducer,},});exportdefaultstore;// 4. 在顶层组件中提供store App.jsimport{Provider}from"react-redux";importstorefrom"./store";createRoot(document.getElementById("root")).render(<StrictMode><Provider store={store}><App/></Provider></StrictMode>);// 5. 在子组件中获取store中的数据 useSelector:映射store中的数据 useDispatch:分发actionimport{useSelector,useDispatch}from"react-redux";import{increment,decrement,addToNum,getChannelList}from"./counterSlice";functionCounter(){// 映射store中的数据constcount=useSelector((state)=>state.counter);constlist=useSelector((state)=>state.channel);constdispatch=useDispatch();// 触发请求useEffect(()=>{dispatch(getChannelList())},[dispatch])return(<div><p>{count}</p><button onClick={()=>dispatch(increment())}>+</button><button onClick={()=>dispatch(decrement())}>-</button>{/* 传参 */}<button onClick={()=>dispatch(addToNum(10))}>+10</button>{/* 数据列表 */}<ul>{list.map((item)=>(<li key={item.id}>{item.name}</li>))}</ul></div>);}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/11 1:29:00

手把手教你部署VSCode中的量子模拟内核:7个专业级配置步骤

第一章&#xff1a;VSCode Jupyter 量子模拟内核概述 VSCode 与 Jupyter Notebook 的深度集成&#xff0c;为量子计算开发者提供了高效、直观的编程环境。通过 Python 内核运行量子模拟代码&#xff0c;用户可以在交互式单元格中设计量子电路、执行测量并可视化结果。该环境广泛…

作者头像 李华
网站建设 2026/3/3 16:09:29

【量子安全合规新标准】:基于MCP SC-400的6步审计落地法

第一章&#xff1a;MCP SC-400量子安全审计的核心理念 在后量子计算时代&#xff0c;传统加密体系面临前所未有的破解风险。MCP SC-400量子安全审计框架应运而生&#xff0c;旨在构建一套面向未来、具备抗量子攻击能力的安全验证机制。该框架不仅评估现有系统的加密强度&#x…

作者头像 李华
网站建设 2026/3/10 9:45:51

3分钟搞定Open WebUI数据可视化:从零到一的终极指南

3分钟搞定Open WebUI数据可视化&#xff1a;从零到一的终极指南 【免费下载链接】open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;设计用于完全离线操作&#xff0c;支持各种大型语言模型&#xff08;LLM&#xff09;运行器&#xff0c;包括…

作者头像 李华
网站建设 2026/3/11 14:48:40

从头说下DOM XSS

Demo此问题1. 写个html 叫test.html吧<!doctype html> <html lang"zh-CN"> <head><meta charset"utf-8"><title>DOM XSS test&#xff1a;test.html</title> </head> <body><h1>DOM XSS test&#…

作者头像 李华
网站建设 2026/3/10 20:34:08

Docker Scout漏洞管理新突破(忽略规则配置全解析)

第一章&#xff1a;Docker Scout漏洞管理新突破Docker Scout 正在重塑容器安全的边界&#xff0c;通过深度集成镜像分析与实时漏洞检测&#xff0c;为开发团队提供从构建到部署全生命周期的安全洞察。其最新功能不仅支持自动扫描公共和私有镜像仓库&#xff0c;还能基于 CVE 数…

作者头像 李华
网站建设 2026/3/5 8:34:47

从开发到生产:边缘Agent Docker部署的7个关键检查项

第一章&#xff1a;从开发到生产的边缘Agent部署概览在现代分布式系统架构中&#xff0c;边缘Agent作为连接中心平台与终端设备的关键组件&#xff0c;承担着数据采集、本地决策和远程协同的职责。其部署流程跨越开发、测试、灰度发布到最终生产环境落地&#xff0c;涉及多环境…

作者头像 李华