如何在 React 的子功能组件中触发一个动作?

2024-01-03

对于基本的表单/输入布局,很明显应该使用回调来处理从子组件到父组件的状态更改(由子组件发起),但是父组件如何要求子组件重新评估其状态并将其传达回父组件?

这里的最终目标只是在提交表单按钮时触发子输入的验证。

给定的 [ts] 代码如下所示:

    const Login : React.FC<Props> = (props) => {
        ...useStates omitted

        const onSubmit = () : void => {
          //trigger `verify()` in PasswordInput to get up-to-date `valid` state var

 
        }
        
        return (
            <PasswordInput
              onValidChange={setValid} />
            <Button
              onPress={submit} />
        )
    }


    const PasswordInput : React.FC<Props> = (props) => {
        ...useStates omitted

        const verify = () => {
          //verify the password value from state

          props.onValidChange(true)
        }


        return (<Input onBlur={verify}/>) 
    }

迄今为止采取的注释/路径:

  • 您不能在函数组件上使用 ref 属性,因为它们没有实例。 https://reactjs.org/docs/refs-and-the-dom.html#accessing-refs
  • 尝试使用useEffect更新一个submitted状态变量确实有效地触发了重新验证,但排序useEffect总是在父组件评估之后出现onSubmit,导致值过时。 IE。在提交之前需要点击两次提交valid变量是最新的。
  • 反应版本 16.14.4

UPDATE得到教训:

  • 如果您要在子组件中触发操作,您可以使用下面 Nadia 概述的 refs 方法,但更合适的 React Way® 可能是通过共享Reducer。
  • 不要期望在调用所述引用时始终通过对父级的回调来更新状态。就我而言,唯一有效的排序方法是获得verify上面的方法实际上返回最新的值。

一个简单的例子说明如何解决这个问题

function Child(props)
{
    const validate=()=> alert('hi from the child');
    props.registerCallback(validate)
    return (<div>I'm the child</div>)
}

function Parent()
{
    const callbackRef = React.useRef();
    function registerCallback(callback)
    {
        callbackRef.current = callback;
    }
    return (<div><Child  registerCallback={registerCallback}/>
        <button onClick={() => callbackRef.current()}>say hello</button></div>)
}

https://jsfiddle.net/4howanL2/5/ https://jsfiddle.net/4howanL2/5/

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

如何在 React 的子功能组件中触发一个动作? 的相关文章

随机推荐

  • py2exe:由于 DLL,编译的 Python Windows 应用程序将无法运行

    我承认我对 Python 还很陌生 而且我还不知道自己在做什么 最近 我使用 Python 2 6 2 和 wxPython 2 8 创建了一个非常小的 Windows 应用程序 而且效果很好 我对它正常运行的情况感到非常满意 通常我的意思
  • C - IF(char[] == "ZYX") 不起作用

    我从arduino发送到arduino字符串 I2C 捕获并保存到char 10 当我将此变量与文本进行比较时 条件没有执行 而且我不知道为什么 char dataRx 10 void DaemonReceiving int howMany
  • 当外字段是数组时 MongoDB 查找

    我搜索过互联网和 StackOverflow 但找不到答案 甚至找不到问题 我有两个收藏 reports and users 我希望我的查询返回所有报告 并指示指定用户是否将该报告作为其数组中的最爱 报告收集 id 1 name Repor
  • Android 虚拟设备管理器因“双重释放或损坏”而崩溃

    当我尝试运行任何模拟器时 我得到 Android 虚拟设备崩溃 https i stack imgur com bmI8A png 我玩 Android studio 的控制台说 Error in home standy Android S
  • 我的 python 代码不将视频帧保存为图像

    我正在尝试抓取视频中的特定帧 例如帧 0 10 20 并使用 Python 和 CV2 将它们保存为图像 由于某些原因 我的代码只保存第一帧 所有其他帧均已创建 但大小为 0 它们已损坏 我该如何解决这个问题 import cv2 from
  • Django Forms,为 request.user 设置初始值

    是否有某种方法可以使以下操作成为可能 或者应该在其他地方完成 class JobRecordForm forms ModelForm supervisor forms ModelChoiceField queryset User objec
  • 实体类型没有定义键 - 代码优先

    我是 MVC 和实体框架的新手 我搜索了很多并发现了一些类似的问题 例如实体类型没有定义键 https stackoverflow com questions 6290511 entity type has no key defined 但
  • ASP.NET-MVC jQuery 不显眼的远程验证返回误报

    我又回到了 9 个月前我最后一次参与的项目 查看了我们编写的一些代码 希望现在有更好的方法来做到这一点 虽然最初对 jQuery 不显眼的验证印象深刻 但我们最终不得不将下面的 hack 组合在一起 部分基于我现在无法动手的博客文章 来处理
  • 如何在 django 中创建并强制执行通用的 OneToOne 关系?

    我想要与完全相同的东西django contrib contenttypes generic GenericForeignKey but OneToOne代替ForeignKey 我认为一个简单的 尽管有点不优雅 的解决方法是添加uniqu
  • window.onpopstate 不起作用;当我导航回页面时没有任何反应

    我正在尝试添加window onpopstate在我网站的其中一个页面上 但什么也没有发生 我把这个脚本放在页面上 我也尝试过 但是 当我导航回该页面时 我没有收到任何警
  • Access 2013:分发 FE 或保留在共享网络驱动器上以用于拆分 DB

    只是想知道拆分数据库的前端部分的最佳实践是什么 该公司有一个每个人都可以访问的共享驱动器 并且是后端的实际位置 只是想知道将 FE 副本分发给每个人是否是更好的做法 或者我是否应该将他们指向共享驱动器上的 FE 方向 后者似乎更容易维护 尽
  • 是否可以在 clang 中禁用此警告?警告:#pragma 一次出现在主文件中

    警告 pragma 一次出现在主文件中 我们通过 clang 运行标头来获取部分 AST 是否可以禁用该警告 Use the Wno pragma once outside header命令行参数 查阅 Clang 文档here https
  • 如何将不在phonegap注册表中的cordova插件添加到meteor?

    根据文档 https github com meteor meteor wiki Meteor Cordova Phonegap integration using cordova plugins directly in your appl
  • 将每个值作为 SQL 中的行重复 n 次

    一段时间以来 我一直试图在 SQL Oracle 11g 中实现这一目标 但找不到合适的方法 我的桌子names有以下几行 NAME REPEAT KAUSHIK 2 KARTHIK 3 NIDHI 1 ASHWINI 5 JAGADEES
  • 梅文。 “无家可归”的罐子该怎么办?

    我有一些 proprietary jar 需要包含在我的项目中 但我不想将其安装到本地存储库 我最初所做的是将 jar 放入我的项目的版本控制中lib 文件夹 然后将 Maven 依赖项指定为
  • HTML5 画布圆形文本

    如何使用画布创建圆形文本 圆形文本 字母现在应该正确定向 CanvasRenderingContext2D prototype fillTextCircle function text x y radius startRotation va
  • 使用正则表达式进行 Github 搜索

    有没有办法使用正则表达式在 github 存储库中搜索代码 目前 我克隆了存储库并进行搜索 但我想输入类似的内容 s foo gi 并查找代码中所有出现 foo 的地方 foo create foo extend fooBar barFoo
  • 从 SurfaceView 获取图像到 ImageView?

    我在从用作相机预览的 SurfaceView 获取图像 可绘制对象或位图时遇到了一些麻烦 final CameraSurfaceView cameraSurfaceView new CameraSurfaceView this Linear
  • 使用边框创建三角形

    我最近需要创建对话气泡 为了在对话气泡的末端创建小三角形尖端 我使用了CSS技术 http jsfiddle net 66jAA 5 其中元素被赋予0 width and 0 height并给定边界 使某些边框透明会产生对角线 这非常有效
  • 如何在 React 的子功能组件中触发一个动作?

    对于基本的表单 输入布局 很明显应该使用回调来处理从子组件到父组件的状态更改 由子组件发起 但是父组件如何要求子组件重新评估其状态并将其传达回父组件 这里的最终目标只是在提交表单按钮时触发子输入的验证 给定的 ts 代码如下所示 const