| 1. 【通过ref】父组件创建ref绑定到子组件并通过forwardRef将父组件的中ref绑定到子组件中具体的DOM元素进而操作。eg: 父组件的ref绑定到子组件的input框上 |
| 2. 【通过useImperativeHandle】ref + forwardRef + useImperativeHandle获取子组件中暴露的属性或方法 |
| 3. 【回调函数传递属性】props + 回调的方式获取子组件中属性 |
| 4. 【状态提升】通过状态提升,完全将子组件中的属性和方法交由父组件 |
方法 1: 通过 ref 获取子组件实例或 DOM 节点
| import React, { forwardRef, useRef } from 'react'; |
| |
| const Child = forwardRef((props, ref) => { |
| return <input ref={ref} placeholder="子组件输入框" />; |
| }); |
| |
| const Parent = () => { |
| const inputRef = useRef(); |
| |
| const handleClick = () => { |
| console.log(inputRef.current.value); |
| }; |
| |
| return ( |
| <div> |
| <Child ref={inputRef} /> |
| <button onClick={handleClick}>读取子组件值</button> |
| </div> |
| ); |
| }; |
| |
| export default Parent; |
方法2:通过useImperativeHandle自定义暴露子组件中属性和行为
| import React, { forwardRef, useImperativeHandle, useRef } from 'react'; |
| |
| const Child = forwardRef((props, ref) => { |
| const inputRef = useRef(); |
| |
| useImperativeHandle(ref, () => ({ |
| getValue: () => inputRef.current.value, |
| clear: () => { |
| inputRef.current.value = ''; |
| }, |
| })); |
| |
| return <input ref={inputRef} placeholder="子组件输入框" />; |
| }); |
| |
| const Parent = () => { |
| const childRef = useRef(); |
| |
| const handleGetValue = () => { |
| console.log(childRef.current.getValue()); |
| }; |
| |
| const handleClear = () => { |
| childRef.current.clear(); |
| }; |
| |
| return ( |
| <div> |
| <Child ref={childRef} /> |
| <button onClick={handleGetValue}>获取值</button> |
| <button onClick={handleClear}>清空值</button> |
| </div> |
| ); |
| }; |
| |
| export default Parent; |
| |
方法3:通过props和子组件回调向父组件暴露属性或行为
| import React, { useState } from 'react'; |
| |
| const Child = ({ onExpose }) => { |
| const [value, setValue] = useState(''); |
| |
| React.useEffect(() => { |
| if (onExpose) { |
| onExpose({ value, setValue }); |
| } |
| }, [onExpose, value]); |
| |
| return <input value={value} onChange={(e) => setValue(e.target.value)} />; |
| }; |
| |
| const Parent = () => { |
| const [childState, setChildState] = useState(null); |
| |
| const handleExpose = (exposed) => { |
| setChildState(exposed); |
| }; |
| |
| const handleRead = () => { |
| console.log(childState?.value); |
| }; |
| |
| const handleModify = () => { |
| childState?.setValue('修改后的值'); |
| }; |
| |
| return ( |
| <div> |
| <Child onExpose={handleExpose} /> |
| <button onClick={handleRead}>读取子组件值</button> |
| <button onClick={handleModify}>修改子组件值</button> |
| </div> |
| ); |
| }; |
| |
| export default Parent; |
| |
方法4:子组件的属性和行为完全交由父组件进行管理
| import React, { useState } from 'react'; |
| |
| const Child = ({ onExpose }) => { |
| const [value, setValue] = useState(''); |
| |
| React.useEffect(() => { |
| if (onExpose) { |
| onExpose({ value, setValue }); |
| } |
| }, [onExpose, value]); |
| |
| return <input value={value} onChange={(e) => setValue(e.target.value)} />; |
| }; |
| |
| const Parent = () => { |
| const [childState, setChildState] = useState(null); |
| |
| const handleExpose = (exposed) => { |
| setChildState(exposed); |
| }; |
| |
| const handleRead = () => { |
| console.log(childState?.value); |
| }; |
| |
| const handleModify = () => { |
| childState?.setValue('修改后的值'); |
| }; |
| |
| return ( |
| <div> |
| <Child onExpose={handleExpose} /> |
| <button onClick={handleRead}>读取子组件值</button> |
| <button onClick={handleModify}>修改子组件值</button> |
| </div> |
| ); |
| }; |
| |
| export default Parent; |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具