使用回调分配 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 与直接设置它之间的区别? 的相关文章

  • 使用 Firefox 插件 sdk 的 nsISocketTransportService

    我正在尝试使用 Firefox 来读取 SSH 横幅 IE 当您最初连接到 SSH 服务器时 服务器会向您发送其横幅 标识服务器软件 并且您向 SSH 服务器发送您的横幅 标识您的客户端软件 为此 我使用以下 URL 中的示例 firefo
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • 检测 Google 验证码的挑战窗口何时关闭

    我正在使用谷歌隐形验证码 有没有办法检测挑战窗口何时关闭 我所说的挑战窗口是指您必须选择一些图像进行验证的窗口 目前 我在按钮上放置了一个旋转器 一旦单击按钮 就会呈现验证码挑战 无法向用户提示另一个质询窗口 我以编程方式调用渲染函数 gr
  • API 使用令牌向 odoo 进行身份验证

    我想使用令牌从 Express 应用程序向 Odoo 进行身份验证 我在用odoo xmlrpc https www npmjs com package odoo xmlrpc连接 Odoo 的节点模块 我的快递应用程序 Odoo 要求 A
  • 将 Firebase FCM 添加到 ReactJS 应用程序

    我正在尝试向我的 ReactJS 应用程序中的用户发送推送通知 我已添加 firebase 请求用户通知权限 这正在发挥作用 但现在我想注册设备令牌 但这给了我错误 消息传递 我们无法注册默认的 Service Worker 无法注册 Se
  • JavaScript中如何确保输入的值是数字而不是字符串?

    我创建了这个函数 function num var x prompt please enter your first number var y prompt please enter your second number if isNaN
  • 如何在 Web 服务器上设置 gzip 压缩?

    我有一个嵌入式网络服务器 总共有 2 兆空间 通常 您使用 gzip 文件对客户端有利 但这会节省我们在服务器上的空间 我读到你可以只 gzip js 文件并将其保存在服务器上 我在 IIS 上测试过 但没有任何运气 为了使这项工作成功 我
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • 如何仅显示/隐藏此 bootstrapvue 表的第二列和第三列?

    下面的代码将显示 隐藏 a 中的所有列BootstrapVue桌子 代码的来源就是这里的答案 使用 bootstrap vue 组件和 bootstrap 3 动态显示 隐藏列 https stackoverflow com questio
  • 如何将 Vue.js 作用域样式应用于通过视图路由器加载的组件?

    如何将 Vue js 作用域样式应用于通过以下方式加载的组件
  • 如何使用新的analytics.js跟踪多个帐户?

    我需要使用 Google 的新的analytics js 跟踪一个页面上两个帐户的综合浏览量 有大量教程和示例如何使用较旧的 ga js 进行操作 但我发现的只是这个分析文档页面 https developers google com an
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 呃!尝试将包发布到 npm 时出现 403

    我正在尝试将包发布到 npm 您可以在此处查看存储库 https github com biowaffeln mdx state https github com biowaffeln mdx state 我登录到 npmnpm login
  • Javascript 浮点乘以 100 仍然有错误

    我有一个货币字段的文本输入 我在字段中输入 33 91 并在尝试使用 乘以 100 技术时得到以下结果 var curWth parseInt trans withdraw index val 100 3390 var curWth par
  • Service Worker 与 Shared Worker

    Service Worker 和 Shared Worker 有什么区别 我什么时候应该使用 Service Worker 而不是 Shared Worker 反之亦然 Service Worker 具有共享 Worker 之外的附加功能
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解
  • d3.event.translate 在触摸设备的缩放上包含 NaN

    我使用 d3 为我的 svg 编写了一个自定义缩放函数 如下所示 Zoom behavior function myzoom xpos d3 event translate 0 ypos d3 event translate 1 vis a
  • ng-include 和 ng-view 不同时加载

    下面是我的应用程序的结构 很简单 页眉和页脚是非常小的文件 而主页上的 ng view 要大得多 当我进入该页面时 我注意到了这一点 首先加载两个 ng include 然后 ng view 出现 页脚被推到底部 页脚闪烁大约 0 1 秒
  • 确定 Javascript 中的日期相等性

    我需要找出用户在 Javascript 中选择的两个日期是否相同 日期以字符串 xx xx xxxx 形式传递给该函数 这就是我需要的全部粒度 这是我的代码 var valid true var d1 new Date datein val
  • 如何在 Jquery/Javascript 中绑定模糊和更改,但只触发一次函数?

    我试图在选择元素更改时触发函数 由于 Ipad 在 on change 方面遇到问题 我还想绑定到 blur 这在 Ipad 上工作得很好 但是我不希望两个事件都触发该函数两次 所以我需要某种挂钩来确保两个事件是否都触发change and

随机推荐

  • 在 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