React refs 如何使用,何时使用?

2023-12-13

您好,感谢您阅读这个问题!

我已经学习 React 几个星期了,我很难理解 refs 如何获取 React 的实例并将其放入 JS 变量中。

例如,我们可以讨论文档的示例:

class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);
    this.focusTextInput = this.focusTextInput.bind(this);
  }

  focusTextInput() {
    // Explicitly focus the text input using the raw DOM API
    this.textInput.focus();
  }

  render() {
    // Use the `ref` callback to store a reference to the text input DOM
    // element in an instance field (for example, this.textInput).
    return (
      <div>
        <input
          type="text"
          ref={(input) => { this.textInput = input; }} />
        <input
          type="button"
          value="Focus the text input"
          onClick={this.focusTextInput}
        />
      </div>
    );
  }
}

我知道 ref 获取将要渲染的输入元素,并使用 this.textInput 将其存储到类字段中。

但是我不明白为什么传递给 refs 的参数是(输入)如果嵌套 jsx 标签会发生什么?例如两个输入?

另外,是否没有一个明确的方法来引用使用 React render/return 创建的元素?我说的是面向对象编程:className.instanceName 或使用 new elementName() 从 HTML 元素创建实例。

感谢您的帮助!


React 支持一个可以附加到任何组件的特殊属性。这ref属性采用回调函数,并且callback将在组件安装或卸载后立即执行。

当你写的时候

<input
      type="text"
      ref={(input) => { this.textInput = input; }} />

React 提取ref属性并在组件安装后调用回调。在该回调函数中,React 传递输入的实例,这就是您在此处作为参数获得的内容。将以上视为一个函数

<input
      type="text"
      ref={this.callback} />

该回调看起来像

const callback = (input) => { 
   this.textInput = input; 
}

根据文档:

当 ref 属性用于 HTML 元素时,ref打回来 接收底层 DOM 元素作为其参数。

关于你的下一个问题:

但是我不明白为什么参数被传递给 refs 是(输入)如果嵌套 jsx 标签会发生什么

传递给 div 的参数只是在示例中作为输入引用,您可以将其称为任何您想要的名称,例如input, inputRef, instance

在嵌套多个 jsx 标签时,ref 应用于传递 ref 属性的元素。例如

<div ref={this.getRef}>
   <div>Hello React</div>
</div>

The ref获取应用于外部 div 的实例,您可以从中访问子元素。

代码沙箱

还有没有一个明确的方法来引用正在创建的元素 使用 React 渲染/返回

Well refs是 React 提供的一种引用、创建元素的方式。但是你应该只在以下情况下使用 refs

  • 管理焦点、文本选择或媒体播放。
  • 触发命令式动画。
  • 与第三方 DOM 库集成。

最经常,props是父组件与其子组件交互的唯一方式。要修改子项,您可以使用新的道具重新渲染它。例如,如果您希望更改元素上的类,而不是访问该元素并更改它的类,您可以将动态属性传递给它,例如

<div className={this.props.className} />

或者事实上,使用state进行必要的更新

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

React refs 如何使用,何时使用? 的相关文章

  • pubnub 和 head.js

    有没有人成功整合过pubnub http www pubnub com 和 head js 正确吗 Pubnub http www pubnub com 希望我将他们的脚本放在页面底部并带有 div 就在它前面的标签 这可以确保在最后调用
  • 定义 js-xlsx 单元格范围

    我正在尝试使用 js xlsx 读取 Excel 值 我可以使用以下代码从工作簿工作表中获取单元格值 if typeof require undefined XLSX require xlsx var workbook XLSX readF
  • Javascript - 在加载所有图像后执行

    看了别人的问题我想 window onload 会回答我的问题 我已经尝试过这个 但它会在页面加载时立即执行代码 而不是在图像加载之后 如果有什么区别的话 图像来自 CDN 并且不是相对的 有人知道解决办法吗 我没有使用 jQuery 想要
  • 在 javascript、jQuery 或 css 中,如何让 div 或 iframe 展开以填充其余空间

    我有三个 iframe 我将顶部 iframe 设置为 50px 高度 将底部 iframe 设置为 50px 但我希望中间 iframe 扩展以填充其余空间 有没有一种技术可以用来对任何窗口屏幕尺寸执行此操作 谢谢 example
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 了解 sort() 比较函数

    我正在使用一个电子商务平台 该平台无法重新排序产品属性字段的选项 这真的很糟糕 因为要插入新选项 您几乎必须删除所有现有选项并重新开始 我正在尝试在客户端进行操作 这是我正在处理的内容 这是针对鞋码的 9 EE 9 1 2 EE 10 EE
  • 无法实例化模块 [$injector:unpr] 未知提供程序:$routeProvider

    我从 AngularJS 升级时收到此错误1 0 7 to 1 2 0rc1 ngRoute 模块不再是核心的一部分angular js文件 如果您继续使用 routeProvider 那么您现在需要包括angular route js在你
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 获取点击的的DOM路径

    HTML div class lol a class rightArrow href a div 伪代码 rightArrow click function rightArrowParents this dom dom is the pse
  • 使用日期字符串数组在引导日期选择器中设置禁用月份不起作用

    我有一个日期选择器 其配置如下 HTML div class input group date div
  • Ember Data 中出现“超出最大调用堆栈大小”错误的原因可能是什么?

    Ember 发布新版本 3 6 0 后 我开始在控制台中收到错误 rsvp js 24 未捕获 RangeError 超出最大调用堆栈大小 在 WeakMap get 在 getCacheFor metal js 25 在 Computed
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • 使用 AngularJS 多部分表单数据将文件上传到 Google Cloud Storage

    我正在尝试使用 AngularJS 中指定的多部分方法将图像文件上传到 Google Cloud Storagehttps cloud google com storage docs json api v1 how tos upload m
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • Node npm 包抛出使用严格:全局发布和安装后未找到命令

    我正在尝试发布 npm 包 当我全局安装该包并尝试运行 cli 命令时 我收到此错误 nvm versions node v0 12 2 bin myPack line 1 use strict command not found nvm
  • 将 RequireJS 与遗留代码结合使用

    我正在处理一个非常大的项目 该项目使用 包含带有脚本标记的 javascript 文件的旧版 JSP 页面 使用其他 javascript 模块而不使用 RequireJS 的骨干模型和视图 现在 我们希望开始将 RequireJS 与 j
  • 强制输入数字小数位

    我想强制

随机推荐

  • 从 procedure 形式转换为 let 形式

    我在scheme中编写了这个程序形式的代码 我需要将其更改为let形式 这是程序表单代码 define PI 3 14159265 define areac lambda d PI d 2 d 2 define volumec lambda
  • 如何使用 FQL 获取未读消息?

    我正在尝试获取所有未读收件箱的正文和发件人 为了获取所有带有未读消息的对话线程 我使用了以下查询 SELECT thread id from unified thread WHERE folder inbox AND unread 1 为了
  • Sed regexp 寻找空格或行尾

    我正在尝试检测包含三个部分的模式 A space m 或 t 空格或行尾 我想保留 2 和 3 例如 我想改变 我确信他没有 to 我确信他不会 我很难表达 3 因为 似乎只匹配空格 而不匹配行尾 这是我尝试过的 echo i m sure
  • 在 WebSphere 8.5 上使用 JASPIC 身份验证模块

    我有一个 JASPIC 身份验证模块 它在 GlassFish WildFly 和 WebLogic 上运行得非常好 现在我们有一个使用 WebSphere 8 5 的新客户 我无法让 auth 模块在那里正常运行 问题是 WebSpher
  • 与 PrimeFaces Converter 混淆(因为它适用于 selectOneMenu)

    AutoComplete demo 中 PlayersConverter 的实现实际上不仅充当转换器 还充当玩家列表的加载器 我对这个模型有点厌倦 因为加载已经在我的项目中实现了 我不明白为什么 Converter 接口没有作为模板实现 C
  • R 中的错​​误...缺少需要 TRUE/FALSE 的值[重复]

    这个问题在这里已经有答案了 以下是我的 R 脚本的一部分 for i in 1 N 1 if 50
  • Magento 管理网格将数据从 Action 发送到 Controller

    我正在尝试编写一个自定义操作来运行我构建的管理网格 是否可以通过 get 或 post 将网格中的列中的值发送到控制器 我尝试过谷歌搜索 但在任何地方都找不到正确的解释 如果可用的话 指向列设置 getter type 等 说明的链接也会很
  • 我应该何时为导出到 BigQuery 的 Firebase Analytics 数据运行每日 ETL 作业?

    我们使用 Firebase Analytics 从我们的应用收集事件 我们已启用将事件导出到 BigQuery 我们每天都会运行一些 ETL 作业 以便在 BigQuery 中创建更友好的分析表 例如会话 购买 问题是我们什么时候应该运行这
  • 通用 F# 函数:如何获取 F# 可辨别联合的类型?

    代码示例 http www tryfsharp org create dutts Generics fsx 我的 F 中有一些映射代码 它采用 C 对象并将其包装在可区分联合中 module MyModule type MappedThin
  • 在 PHP 中保护文件上传的好方法

    编写一个小应用程序 除其他事项外 让用户上传文件 例如图像 doc 或文本文件 作为他们发布 提交的一部分 我们当前的原型只是将文件转储到 app root 文件 但是当然 即使没有登录或使用该系统 任何人都可以访问该内容 目标是仅授予访问
  • 计算天、小时和分钟的时间差

    更新 我正在更新问题以反映完整的解决方案 使用下面提到的 time diff gem Brett 以下代码有效 code cur time Time now strftime Y m d H M Time diff Time parse 2
  • 如何精确匹配整个文档?

    精确匹配子文档很容易 但是有没有办法精确匹配集合中的整个文档 我有很多包含相似数据的文档 我只需要精确匹配 不需要额外的数据 使用负 exists 对我不起作用 因为我事先不知道所有可能的字段 我认为这不可能完全实现 但一个可能的解决方案是
  • 日志在生产中无法正常工作,作业延迟

    我遇到了一些奇怪的问题 我的delayed jobs 在生产中失败 最后我将范围缩小到记录器 如果我注释掉我的日志函数调用 一切都会正常 但是 如果我尝试记录 我会在delayed job处理程序中得到这个 ruby struct Dela
  • 通用静态字段初始化

    我只是对以下代码感到好奇 public static class Container
  • Swift 4 中的 UIButton 数组

    我用 UIButtons 在 UiKit 中制作了一系列复选框 IBOutlet weak var Box1 UIButton IBOutlet weak var Box2 UIButton IBOutlet weak var Box3 U
  • 如何摆脱 Chrome 控制台中的 [VM] 行?

    现在我可以在我的 chrome 开发者工具中看到有关 VM 的信息 如下所示 我找到了一些解决方案 例如将 暂停按钮 设为灰色 但是 它在我的开发工具中已经是灰色的 这对我来说也不起作用 如何消除控制台中的虚拟机消息 感谢您阅读我的问题 右
  • 当我尝试启动 jetty 时,为什么 lambda 表达式会破坏 guice 错误处理?

    我在尝试启动 jetty 时遇到以下问题 出现以下异常 Execution default test of goal org apache maven plugins maven surefire plugin 2 17 test fail
  • Xcode 中的 EXC_BAD_ACCESS 中断?

    我对 iPhone 开发和 Xcode 不太熟悉 不知道如何开始排除故障EXC BAD ACCESS信号 如何让 Xcode 在导致错误的确切行处中断 我似乎无法让 Xcode 在导致问题的线路上停止 但我确实在调试控制台中看到以下几行 1
  • Android 状态栏动画

    我是 Android 新手 我想做一个电池充电动画例如 在手机中 屏幕右上角的小图标在充电时会上下移动 并在当前电池百分比处停止 到目前为止 在我的代码中 我已经能够让它移动 但它永远不会停止 我想要的是动画在未充电时停止或以当前电池百分比
  • React refs 如何使用,何时使用?

    您好 感谢您阅读这个问题 我已经学习 React 几个星期了 我很难理解 refs 如何获取 React 的实例并将其放入 JS 变量中 例如 我们可以讨论文档的示例 class CustomTextInput extends React