React 16:使用钩子和功能组件时从父级调用子级函数

2024-02-02

我需要在父组件中调用子组件的函数。我该怎么做呢?之前在 React 15 中,我可以使用 refs 来调用子函数。但不知道如何使用钩子和功能组件来做到这一点。

function Child(props) {
    function validate() {
        // to validate this component
    }

    return (
        <>Some code here</>
    )
}


function Parent(props) {
    const refs = useRef([]);
    const someData = [1,2,3,4,5];

    function validateChildren() {
        refs.current.forEach(child => {
            child.current.validate(); // throw error!! can not get validate function
        });
    }

    return (
        <>
            <button onClick={validateChildren}>Validate</button>
            {
                someData.map((data, index) => {
                    return <Child ref={ins => refs.current[index] = ins} />
                })
            }
        </>
    )
}

我的实际要求是: 1.有多个选项卡,可以根据用户的行为添加、删除 2. 单击选项卡父级中的按钮触发验证 3. 所有选项卡都需要验证自身,在选项卡中显示错误消息并返回验证消息


您可以使用useImperativeHandle with forwardRef https://reactjs.org/docs/forwarding-refs.html.

来自docs https://reactjs.org/docs/hooks-reference.html#useimperativehandle,

使用命令句柄自定义使用 ref 时暴露给父组件的实例值。与往常一样,在大多数情况下应避免使用引用的命令式代码。使用命令句柄应该与使用前向引用

const Child = React.forwardRef((props,ref) => {

    //validate will be available to parent component using ref
    useImperativeHandle(ref, () => ({
      validate() {
        // to validate this component
        console.log("I'm clicked");
      }
    }));

    return (
        <>Some code here</>
    )
})

在父组件中,您可以访问子函数,如下所示:

function validateChildren() {
   refs.current.forEach(child => {
      child.validate(); // you can access child method here 
   });
}

Demo https://stackblitz.com/edit/react-a1mlqw

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 16:使用钩子和功能组件时从父级调用子级函数 的相关文章

  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • iostream 链接器错误

    我有一些旧的 C 代码 我想将它们与一些 C 代码结合起来 以前的C代码有以下内容 include
  • 使用父级“导出器”与使用导出器“导入”;

    如果我使用第一个示例而不是第二个示例 我会得到什么 package Some Module use strict use 5 10 1 use parent Exporter our EXPORT OK qw some func packa
  • 在 tomcat servlet 中检测客户端断开连接?

    如何检测 tomcat servlet 请求的客户端已断开连接 我读到我应该执行一个response getOutputStream print 然后执行一个response getOutputStream flush 并捕获一个IOExc
  • 仅因(互斥)要求子句的差异而导致隐藏好友的超载:合法还是违反 ODR?

    考虑以下类模板 其中包含两个 隐藏的 友元声明同一个朋友的 same 功能类型 见下文 它也定义了友元 因此友元是内联的 但定义条件为 互斥 要求子句 include
  • 警告 C4661:没有为显式模板实例化请求提供合适的定义

    我编写了一个类模板并在不同的 DLL 中使用它 因此希望隐藏实现的某些部分 为此 我使用 模板实例化 但将其导出 如下所示 这是头文件 include
  • MVC Actionlink 和 Bootstrap 模态提交

    我正在开发一个 MVC 5 Web 应用程序 在我的一个 Razor 视图中 我有一张表 其中显示了几行数据 每行数据旁边都有一个删除按钮 当用户单击删除按钮时 我希望弹出 Bootstrap Modal 并要求用户确认删除 foreach
  • XTend 的命令行编译器

    Hi all我找到了 XTend http xtend lang org 它听起来确实很棒 但是 我看不到这种语言的任何独立命令行编译器 好像只能在eclipse下运行 我做了一些研究 发现有人说它有一个命令行编译器 但我找不到下载链接 编
  • 绘制折线时某些设备上出现奇怪的 ArrayIndexOutOfBoundsException

    下面是我用来绘制路线的代码 每当用户暂停锻炼时 我想将此路径显示为粉红色折线 因此我制作了自己的界面 名为MapHelper并将一个布尔值作为isPause and lastPause 当用户保存他 她的锻炼时 我将所有路线点保存为数组 并
  • 是否有适用于 Windows 平台的轻量级、可编程 Sandbox API? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 为了在家运行不受信任的代码 我使用 VMWare 虚拟机 我想找到一个替代的轻量级沙箱 API 来运行
  • 在 Android 中从一项活动转移到另一项活动

    以下是我的代码 请告诉我我做错了什么 package version nitt import android app Activity import android os Bundle import android view View im
  • 如何最好地在 WiX 中定义自定义操作?

    我有一个WiX http en wikipedia org wiki WiX安装程序和一个自定义操作 加上撤消和回滚 它使用安装程序的属性 自定义操作必须在所有文件都位于硬盘上之后发生 为此 您似乎需要 WXS 文件中的 16 个条目 根内
  • 下拉当前索引 onchange

    有一个包含 5 个选项的下拉菜单 当前 选择了选项 2 用户现在选择了选项 4 onchange 事件被触发 该事件被 JS 函数捕获 监听选择上的 onchange 在 JS 函数中 我可以使用以下命令轻松检查用户选择的选项的索引选定索引
  • 使用注释移动 Google 图表列注释位置:线

    使用下面的示例 是否可以移动注释 以便在使用时它们全部出现在图表底部的相同 静态 位置style line 这使得注释垂直阅读 google charts load current callback function drawChart w
  • 我可以向现有 ATL COM 项目添加 MFC 支持吗

    我使用 ATL COM Object 创建了一个 Shell 扩展 但在创建过程中我没有添加MFC支持 我现在可以更改设置以添加 MFC 支持吗 是的 但我相信这样做不会自动添加所有必需的标头和 defines 当然 您可以先尝试此操作 然
  • 在 python 中使用时区获取当前时间?

    我正在使用 Google App Engine 和 python 而且我无法安装第三方库 我认为这应该可行 但它实际上运行没有错误 但它返回当前时区未应用 我做错了什么 from datetime import tzinfo timedel
  • 图例中的刻度尺寸符号

    我绘制了一个气泡图 http www r bloggers com wp content uploads 2010 12 bubbleChart png圆圈的大小对应于使用 matplotlib 的值列表 但是 我在为具有与列出的大小相对应
  • 从字符串中分割货币和金额

    我正在导入一个包含不同货币符号的金额的文件 12 10 26 13 12 50 我需要将其导入并转换为单一货币 我将字符串拆分如下 parts split preg replace 0 9 1 amount 1 无法使 preg split
  • Android中文件、类和活动之间的区别

    Android中的文件 类和活动有什么区别 文件 它是任意信息块或用于存储信息的资源 它可以是任何类型 类 它是 Java 文件的编译形式 Android最终使用这个 class文件生成可执行的apk 活动 活动相当于 GUI 工具包中的框
  • 禁用 Django 中特定应用程序的本地化

    有没有办法在 Django 设置中禁用特定应用程序的本地化 造成这种情况的可能原因有两个 关闭管理应用程序 例如 contrib admin 中的本地化 因为管理员更喜欢使用英语而不是本地语言 一些应用程序的默认翻译确实很糟糕且令人困惑 我
  • React 16:使用钩子和功能组件时从父级调用子级函数

    我需要在父组件中调用子组件的函数 我该怎么做呢 之前在 React 15 中 我可以使用 refs 来调用子函数 但不知道如何使用钩子和功能组件来做到这一点 function Child props function validate to