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

react Hooks 父组件调用子组件函数、获取子组件属性

子组件

import { forwardRef, useImperativeHandle } from 'react'

// 定义子组件的 ref 类型
export interface ChildRef {
  childMethod: () => void
  childValue: string
}

const Child = forwardRef<ChildRef>((props, ref) => {
  // 暴露给父组件的方法和属性
  useImperativeHandle(ref, () => ({
    childMethod: () => {
      console.log('子组件方法被调用')
    },
    childValue: 'child value'
  }))

  return <div>子组件</div>
})

export default Child

父组件

import { useRef } from 'react'
import Child, { type ChildRef } from './Child'

const Parent = () => {
  const childRef = useRef<ChildRef>(null)

  const handleClick = () => {
    // 调用子组件方法
    childRef.current?.childMethod()
    // 访问子组件属性
    console.log(childRef.current?.childValue)
  }

  return (
    <div>
      <Child ref={childRef} />
      <button onClick={handleClick}>调用子组件方法</button>
    </div>
  )
}

获取使用使用 Context(适用于多层级组件通信

context.ts

import { createContext } from 'react'

interface ContextType {
  parentMethod: () => void
  parentValue: string
}

export const MyContext = createContext<ContextType>({
  parentMethod: () => {},
  parentValue: ''
})

Parent.tsx

const Parent = () => {
  const contextValue = {
    parentMethod: () => {
      console.log('父组件方法被调用')
    },
    parentValue: 'parent value'
  }

  return (
    <MyContext.Provider value={contextValue}>
      <Child />
    </MyContext.Provider>
  )
}

Child.tsx

import { useContext } from 'react'
import { MyContext } from './context'

const Child = () => {
  const { parentMethod, parentValue } = useContext(MyContext)

  return (
    <div>
      <button onClick={parentMethod}>调用父组件方法</button>
      <div>父组件值: {parentValue}</div>
    </div>
  )
}

http://www.kler.cn/a/504431.html

相关文章:

  • 【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序
  • type 属性的用途和实现方式(图标,表单,数据可视化,自定义组件)
  • spring mvc源码学习笔记之十一
  • 基于单片机的智能花卉浇水系统的设计与实现
  • Java 将RTF文档转换为Word、PDF、HTML、图片
  • react与nodejs实现流式传输,并可以进行中断(fetch聊天版)
  • RTX 5090 加持,科研服务器如何颠覆 AI 深度学习构架?
  • 自动驾驶ADAS算法--测试工程环境搭建
  • RDP、VNC、SSH 三种登陆方式的差异解析
  • 工程水印相机结合图纸,真实现场时间地点,如何使用水印相机,超简单方法只教一次!
  • 【免费开源】积木JimuBI大屏集成eladmin
  • arcgis中生成格网矢量带高度
  • 【MySQL】简单解析一条SQL查询语句的执行过程
  • 注册中心及技术选型对比分析
  • Single-agent和Multi-agent的区别及各自适用的落地场景(ChatGPT-4o,智谱清言 GLM 4 Plus 回答)
  • C#使用OpenTK绘制3D可拖动旋转图形三棱锥
  • 2025年01月13日Github流行趋势
  • 网络层协议-----IP协议
  • k8s之pod生命周期
  • Open FPV VTX开源之betaflight配置
  • 深度剖析RabbitMQ:从基础组件到管理页面详解
  • TiDB常见操作指南:从入门到进阶
  • Unreal Engine 5 C++ Advanced Action RPG 八章笔记
  • 【Uniapp-Vue3】uni-api交互反馈showToast的使用方法
  • RV1126+FFMPEG推流项目(4)VENC模块视频编码流程