使用回调分配 React ref 与直接设置它之间的区别?

2024-01-10

它的工作原理和行为相同,但想知道直接设置 ref 与通过以元素作为参数的回调设置它是否有任何实际差异。

给定这个反应钩子组件:

const myComponent = ({ ...props}) => {
  const myRef = React.useRef(null);

  ...

  return (
    <div>
      ref={myRef}
    </div>
  )
}

versus

const myComponent = ({ ...props}) => {
  const myRef = React.useRef(null);

  ...

  return (
    <div>
      ref={element => {
        myRef.current = element;        
      }}
    </div>
  )
}

两者相似,根据useRef https://reactjs.org/docs/hooks-reference.html#useref docs:

useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传递的参数 (initialValue)。

因此,第一个代码示例的工作方式与第二个代码示例完全相同。

Except

如果您想在 React 将 ref 附加到 DOM 节点或从 DOM 节点分离时运行一些代码,您可能需要使用回调 ref。

意义;如果你想重新渲染组件,那么你可以使用回调引用。


最好的例子来自docs https://reactjs.org/docs/hooks-faq.html#how-can-i-measure-a-dom-node itself:

测量 DOM 节点的位置或大小

function MeasureExample() {
  const [height, setHeight] = useState(0);

  const measuredRef = useCallback(node => {
    if (node !== null) {
      setHeight(node.getBoundingClientRect().height);
    }
  }, []);

  return (
    <>
      <h1 ref={measuredRef}>Hello, world</h1>
      <h2>The above header is {Math.round(height)}px tall</h2>
    </>
  );
}

因此,您可以发现使用回调 ref 会改变元素的高度。如果您没有使用回调引用,那么它就不会被重新渲染,并且不会更新任何内容高度。

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

使用回调分配 React ref 与直接设置它之间的区别? 的相关文章

  • Draggable 正在阻止触摸事件

    我正在尝试使用拖动来来回移动 div 这部分工作正常 直到 div 具有可滚动内容 由于滚动条 这在桌面上不是问题 但在触摸设备上会出现问题 由于触摸事件与拖动事件冲突 我无法滚动内容 我尝试创建一个条件来检测拖动是否水平方向多于垂直方向
  • 旋转嵌套 SVG

    我在用SVG js http svgjs com并尝试使用 SVG 进行一些操作 我以前使用过 canvas 但我对其生成的图像质量非常失望 因此我决定使用纯 SVG 我设法将所有内容都改为纯 SVG 方法 除了一件事 旋转 我无法让它发挥
  • Javascript - window.getCompulatedStyle 返回“auto”作为元素顶部和左侧属性

    在我的网页上 我有一些元素 div 子 div 按钮等 其位置是相对于它们所在的 div 以及彼此之间生成的 这会导致使用时的结果window getCompatedStyle the top and left属性不是数字值 而是简单的 a
  • 使用 jQuery 触发真实事件

    看来 jQuery 的trigger 仅运行与 jQuery 绑定的事件处理程序 我有一些使用本机浏览器事件绑定的模块 使用来自的代码https stackoverflow com a 2676527 https stackoverflow
  • 在 javascript 中循环 html 复选框

    实际上我有一个关于如何在java脚本中循环复选框的问题 假设我在jsp循环中创建了html复选框 我希望在javascript中对这些复选框进行验证 我应该怎么做 通常对于单个对象 我们可以执行 window document form c
  • d3js v5 + Topojson v3 关于加入 csv 和 json 的优化

    为了制作地图 我需要将一些值从 csv 导入到 json直接在代码中 为了加载 json 和 csv 文件 我使用 Promise 对象的异步操作 并使用两个循环和一个公共键在 json 文件上添加新属性 for var i 0 i lt
  • ChartRangeFilter 作为谷歌时间轴图表的缩放功能,可使用数据视图从专用谷歌电子表格中读取数据

    我的目标是整合Whitehat 提供的这种缩放功能 https stackoverflow com questions 49306638 google timeline visualization dont change series ro
  • 根据每个选项的值或 ID 过滤选择框

    我想使用jquery来过滤表单中的所有选择框 例如 在第一个选择框中 如果我选择 仅显示1 我想过滤所有选择元素中的所有选择选项 以隐藏值不包含 1 的任何选项 仅应显示带有 1 的产品值 如果选择 Filter 选项 则所有选择框的默认值
  • IE7 真的不支持indexOf javascript 吗? [复制]

    这个问题在这里已经有答案了 可能的重复 数组上的 indexOf 函数在使用 JavaScript 的 IE7 8 中不起作用 https stackoverflow com questions 11544983 indexof funct
  • 如何在不知道id的情况下从内页获取父iframe元素?

    让我们想象一下我有这样的东西 div div test html 是空页面 自定义hash属性始终具有不同的值 出于安全原因两个页面位于同一域 iframe 元素的数量和顺序是随机的 我的问
  • 在 Photoshop 中使用 javascript 修改文本项的内容

    我知道如何使用这样的代码在 Photoshop 中设置文本项的内容 var al doc activeLayer if al kind LayerKind TEXT get the textItem var ti al textItem c
  • 如何检查浏览器中消失的元素?

    How can I inspect an element which disappears when my mouse moves away 我不知道它的 ID 类别或其他任何信息 但想检查它 我尝试过的解决方案 在控制台内运行 jQuer
  • 具有多种布局的 React Router v4

    我想在我的公共布局中渲染一些路线 并在我的私人布局中渲染一些其他路线 有没有一种干净的方法可以做到这一点 显然不起作用的示例 但我希望大致解释我正在寻找的内容
  • useState 以 `new` 关键字作为参数

    我正在构建一个单独的服务来处理复杂的事情 该服务是一个类 只是为了测试建议 我在一个内部模拟useState 重点是我忘记了一个console log在构造函数内部 并意识到类构造函数在组件重新渲染时被调用多次 这种行为不会导致意外的行为或
  • 返回不在函数中

    Firebug 报告 返回不在函数中 错误 没有位置 好吧 第 1 行什么都没有 我怎样才能找到这个错误的根源 return not in function Break on this error return 0 javascript r
  • Angular CDK Overlay,更改默认覆盖容器

    有没有办法改变OverlayContainer 我创建了一个工具提示组件 但有时我想将叠加层附加到特定元素 默认情况下 叠加层附加到文档正文 以下是我创建叠加层的方法 private initOverlay void const posit
  • Typescript 和 React 使用空类型数组设置初始状态

    假设我有以下片段 interface State alarms Alarm export default class Alarms extends React Component lt State gt state alarms 因为我想设
  • 是否可以对 Flexbox 插入、删除和项目位置进行动画处理?

    这个问题最初是在 2012 年提出的 https stackoverflow com questions 11106876 is it possible to animate flexbox inserts removes但是提供的答案并未
  • 通过 Javascript 填充 ReactJS HTML 表单

    我正在开发一个应用程序 在打开第 3 方网站后 我可以在浏览器上下文中运行我自己的 Javascript 作为一个基于reactjs构建并具有登录表单的示例网站 您可以参考此链接 我正在尝试在reactjs生成的表单中填写用户名和密码 但是
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为

随机推荐

  • 在 C++ 中使用 new 分配大于 2GB 的单个对象(在 Windows 上)

    我使用的是 Windows x64 模式 在 Visual Studio 上使用 MSVC 编译 这new当我这样做时 运算符似乎没有按预期工作 char buf new char 1LLU lt lt 32 但是如果我传入一个变量而不是直
  • 如何在两个PHP文件之间传递变量?

    我在名为 one php 的文件中有以下代码 a href two php Click here for 1 a a href two php Click here for 2 a 现在 当我单击锚标记链接之一时 它会将我带到two php
  • 如何在颤振中在屏幕中央创建标签栏?

    我正在尝试使用 flutter 在屏幕中心创建一个选项卡栏 同时尝试在列中给出 TabBarView 但我陷入了这个错误 请解决这个问题 I flutter 3983 EXCEPTION CAUGHT BY RENDERING LIBRAR
  • 是否可以像 Matlab 一样在 IPython 中显示对象实例变量?

    我正在尝试从 Matlab 转向 Python 而魔法 IPython 很好 Matlab 的一个非常好的功能是您可以在命令行上 通过省略 看到相关对象的实例变量 在 Matlab 中称为属性 这在 python 中可能吗 我猜是通过 IP
  • firebase实时数据库分片规则

    2019 11 03 更新 添加了错误的实时最小再现 https shardautherror firebaseapp com 在 Chrome 中加载链接后 按 ctrl shift i 并选择控制台以查看输出 我已尽力确保这完全符合我原
  • 警告:列表中的每个子项都应该有一个唯一的“key”道具,即使它有唯一的 key React

    所以我想渲染数组 但它一直说 警告 列表中的每个子项都应该有一个唯一的 key 道具 即使它有唯一的键 我的数组包含三个元素 它甚至不能正确渲染第三个数组 由于某种原因 该按钮甚至无法在第三里工作 import React useEffec
  • 超级能力:仅当字符串以行开头时才将其与分词器匹配

    在超级能力中进行标记时 仅当字符串是一行中的第一件事时 如何匹配字符串 注意 这是一个与this one https stackoverflow com questions 52706549 superpower match a strin
  • 如何使用php访问Oracle APEX的数据库?

    我刚刚发现PHP and APEX互相对比 我想做的是操纵Oracle数据库使用PHP代替APEX 我想要这样做的主要原因是免费使用 Oracle 数据库 作为初学者 您可能会发现这很有用 http php net manual en fu
  • 相对布局忽略 setMargin()

    我正在尝试嵌套一个RelativeLayout里面的一个LinearLayout 并给出RelativeLayout将其边缘与边缘的边缘隔开的边距LinearLayout 到目前为止我有这个 LayoutInflater from cont
  • VueJS - Vue 未定义

    我挑战自己编写一个应用程序 从 API 获取数据并将其显示在各种组件中 我对 VueJS 还很陌生 我使用 VueResource 来访问 API 使用 VueX 来进行状态管理 我已经设置了我的商店 我添加了操作 突变和吸气剂等 一旦我添
  • Visual Studio 2015 解决方案向后兼容 Visual Studio 2013

    看来我可以在 VS 2015 中打开 VS 2013 解决方案文件 我有几个关于向后兼容性的问题 能否在 VS 2015 中安全地维护 VS 2013 解决方案 而不会失去在 VS 2013 中处理该解决方案的能力 VS 2015 解决方案
  • iOS:注册令牌无效。检查令牌格式

    我是 Firebase 和 iOS 的新手 我正在尝试使用 FCM 发送推送通知 我在 FCM 上注册了一个 iOS 应用程序 两个都 p12添加了证书 根据FCM开发的代码 通过发送通知时Firebase 控制台 https fireba
  • Kindle SDK 语言/平台

    有谁知道新的语言 平台是什么会支持吗 Kindle 开发工具包 KDK 基于 Java 来自FAQ https kindlepublishing amazon com gp vendor kindlepubs kdk get content
  • 如何克隆对象

    当我执行以下操作时 对人 b 所做的任何操作都会修改人 a 我认为这样做会从人 a 克隆人 b 我也不知道链接后更改人员 a 是否会更改人员 b 由于我现在的代码 我只能在 1 个方向看到这一点 Person a new Person he
  • Excel (Office 365) 在执行 UDF 时自动重新启动

    在此先感谢您的帮助 我不确定 UDF 中的问题出在哪里 但执行程序后 Excel 自动重新启动 并且还显示 MsxBox 两次和参考值 Public queryString As String Public Function SetIt R
  • RSA 解密 C# (.NET 3.5) 中的数据,该数据在 php 5.3.2 中使用 openssl 加密

    也许有人可以澄清我 我已经在这上面冲浪有一段时间了 步骤 1 创建根证书 Key generation on unix 1 openssl req x509 nodes days 3650 newkey rsa 1024 keyout pr
  • 在没有 XML 的 Spring 4 中使用 EhCache

    有没有一种方法可以在 Spring 4 中或使用 Spring Boot 中不使用 xml 来初始化 EhCache 我注意到 Spring Boot 1 0 0 RC3 没有任何 ehcache 依赖项 但是Spring 4 0GA 发布
  • 在 AWS S3 中创建对象的新版本是最终一致还是写后读一致?

    我从 Amazon 的文档中看到 将新对象写入 S3 是写后读一致的 但更新和删除操作最终是一致的 我猜想推动新版本打开版本控制的对象最终会像更新一样保持一致 但我找不到任何文档来确认 有人知道吗 编辑 我的问题是关于指定或不指定显式版本的
  • 返回对象数组(来自对象数组)

    我有以下数据 我想返回一个 对象 数组years是不同的 我尝试了以下函数 但我得到了数组中的数组 const data id 1 name test1 years id 1 name year1 id 2 name year2 id 2
  • 使用回调分配 React ref 与直接设置它之间的区别?

    它的工作原理和行为相同 但想知道直接设置 ref 与通过以元素作为参数的回调设置它是否有任何实际差异 给定这个反应钩子组件 const myComponent props gt const myRef React useRef null r