- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
问题
我正在使用内联函数定义设置一个 react ref
render = () => {
return (
<div className="drawer" ref={drawer => this.drawerRef = drawer}>
然后在 componentDidMount
中未设置 DOM 引用
componentDidMount = () => {
// this.drawerRef is not defined
我的理解是 ref
回调应该在挂载期间运行,但是添加 console.log
语句显示 componentDidMount
在之前被调用 ref 回调函数。
我看过的其他代码示例(例如 github 上的 this discussion)表明了相同的假设,componentDidMount
应该在任何 ref
回调之后 被调用在render
中定义,甚至是stated in the conversation
So componentDidMount is fired off after all the ref callbacks have been executed?
是的。
我正在使用 React 15.4.1
我尝试过的其他方法
为了验证 ref
函数是否被调用,我尝试在类上定义它
setDrawerRef = (drawer) => {
this.drawerRef = drawer;
}
然后在render
<div className="drawer" ref={this.setDrawerRef}>
在这种情况下,控制台日志显示回调确实在 之后 componentDidMount
最佳答案
简答:
React 保证 refs 设置在 componentDidMount
之前或 componentDidUpdate
钩子(Hook)。但仅限于实际渲染的 child 。
componentDidMount() {
// can use any refs here
}
componentDidUpdate() {
// can use any refs here
}
render() {
// as long as those refs were rendered!
return <div ref={/* ... */} />;
}
请注意,这并不意味着“React 总是在这些钩子(Hook)运行之前设置所有 refs”。
让我们看一些没有设置 refs 的例子。
React 只会为您实际<strong>从渲染返回的元素调用 ref 回调。
这意味着如果你的代码看起来像
render() {
if (this.state.isLoading) {
return <h1>Loading</h1>;
}
return <div ref={this._setRef} />;
}
最初是this.state.isLoading
是true
,你应该不期待this._setRef
在componentDidMount
之前被调用.
这应该是有道理的:如果您的第一个渲染返回 <h1>Loading</h1>
,React 不可能知道在某些其他条件下它会返回其他需要附加 ref 的东西。也没有任何东西可以将 ref 设置为: <div>
未创建元素,因为 render()
方法说它不应该被渲染。
所以对于这个例子,只有componentDidMount
会开火。但是,当 this.state.loading
更改为 false
,你会看到this._setRef
先附上,然后是componentDidUpdate
会开火。
请注意,如果您将带有 refs 的子组件传递给其他组件,它们有可能正在做一些阻止渲染的事情(并导致问题)。
例如,这个:
<MyPanel>
<div ref={this.setRef} />
</MyPanel>
如果 MyPanel
将不起作用不包括 props.children
在其输出中:
function MyPanel(props) {
// ignore props.children
return <h1>Oops, no refs for you today!</h1>;
}
同样,这不是错误:React 不会设置 ref,因为 DOM 元素未创建。
ReactDOM.render()
,则不会在生命周期之前设置它们与上一节类似,如果您将带有 ref 的子项传递给另一个组件,则该组件可能会做一些阻止及时附加 ref 的事情。
例如,它可能不会从 render()
返回 child , 而不是调用 ReactDOM.render()
在生命周期钩子(Hook)中。您可以找到此 here 的示例.在那个例子中,我们呈现:
<MyModal>
<div ref={this.setRef} />
</MyModal>
但是MyModal
执行 ReactDOM.render()
调用它的 componentDidUpdate
生命周期方法:
componentDidUpdate() {
ReactDOM.render(this.props.children, this.targetEl);
}
render() {
return null;
}
自 React 16 以来,此类生命周期中的顶级渲染调用将被延迟,直到整个树的生命周期运行完毕。这可以解释为什么您没有及时看到附加的引用。
这个问题的解决方案是使用 portals而不是嵌套 ReactDOM.render
调用:
render() {
return ReactDOM.createPortal(this.props.children, this.targetEl);
}
这边我们的<div>
具有 ref 实际上包含在渲染输出中。
因此,如果您遇到此问题,您需要确认您的组件和 ref 之间没有任何可能延迟渲染子项的内容。
setState
存储引用确保你没有使用 setState
将 ref 存储在 ref 回调中,因为它是异步的并且在它“完成”之前,componentDidMount
将首先执行。
如果以上提示均无帮助,请在 React 中提交问题,我们将进行查看。
关于javascript - componentDidMount 在 ref 回调之前被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074747/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!