我希望在react.js组件的DOM元素(包括所有子节点)实际加载到页面上并准备就绪时,在该组件上调用回调函数。具体来说,我有两个组件,希望呈现相同的大小,选择自然大小较大的组件中的最大值。看起来componentDidMount并不是我真正想要的,因为每个组件只调用它一次,但我希望在组件完成渲染时再次调用回调函数。我以为可以在顶层DOM元素中添加一个onLoad事件,但我猜这只适用于某些元素,如<body>和<img>。
componentDidMount
onLoad
<body>
<img>
elcex8rz1#
在componentDidMount中添加加载侦听器
class Comp1 extends React.Component { constructor(props) { super(props); this.handleLoad = this.handleLoad.bind(this); } componentDidMount() { window.addEventListener('load', this.handleLoad); } componentWillUnmount() { window.removeEventListener('load', this.handleLoad) } handleLoad() { $("myclass") // $ is available here } }
tzcvj98z2#
看起来componentDidMount和componentDidUpdate的组合可以完成这项工作。第一个函数在初始渲染之后调用,当DOM可用时,第二个函数在任何后续渲染之后调用,一旦更新的DOM可用。在我的例子中,我将它们都委托给一个公共函数来做同样的事情。
componentDidUpdate
yrefmtwq3#
componentDidMount和componentDidUpdate的组合可以用类组件来完成代码的工作,但是如果你用函数组件来编写代码,the Effect Hook会做得很好,它和componentDidMount和componentDidUpdate是一样的。
the Effect Hook
import React, { useState, useEffect } from 'react'; function Example() { const [count, setCount] = useState(0); // Similar to componentDidMount and componentDidUpdate: useEffect(() => { // Update the document title using the browser API document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }
https://reactjs.org/docs/hooks-effect.html
qlvxas9a4#
我对表应用了componentDidUpdate,使所有列的高度相同。它的工作原理与jquery中的$(window).load()相同。例如:
componentDidUpdate: function() { $(".tbl-tr").height($(".tbl-tr ").height()); }
lndjwyie5#
我发现,只需在componentDidMount或componentDidUpdate中用时间为0毫秒的setTimeout Package 代码,就可以确保在执行setTimeout函数之前,浏览器DOM已经用React更改进行了更新。就像这样:
setTimeout
componentDidMount() { setTimeout(() => { $("myclass") // $ is available here }, 0) }
这会将匿名函数放在JS事件队列中,以便在当前运行的React堆栈帧完成后立即运行。
bwitn5fc6#
在现代浏览器中,它应该像这样
try() { if (!$("#element").size()) { window.requestAnimationFrame(try); } else { // do your stuff } }; componentDidMount(){ this.try(); }
u1ehiz5o7#
对我来说似乎起作用了
const [isLoaded, setIsLoaded] = useState(false); const [isPageLoaded, setIsPageLoaded] = useState(false); //this helps useEffect(() => { setIsLoaded(true); }, []); useEffect(() => { if (isLoaded) { setIsPageLoaded(true); } }, [isLoaded]);
0dxa2lsx8#
下面是我在尝试使用document.getElementsByClassName获取类之前等待DOM准备好的结果。我从componentDidMount()生命周期方法调用了此函数。
changeIcon() { if ( document.getElementsByClassName('YOURCLASSNAME') .length > 0 && document.getElementsByClassName('YOURCLASSNAME').length > 0 ) { document.getElementsByClassName( 'YOURCLASSNAME' )[0].className = 'YOUR-NEW-CLASSNAME'; document.getElementsByClassName( 'YOUR-OTHER-EXISTING-CLASSNAME' )[0].style.display = 'block'; } else { setTimeout(this.changeIcon, 500); } }
6mw9ycah9#
在下面的app.js [初始js文件]中添加以下代码,它将检测窗口刷新:
window.onload = () => { if (window.location.pathname != "/") { window.location = "/"; } }; // const App = (props) => {
9条答案
按热度按时间elcex8rz1#
在componentDidMount中添加加载侦听器
tzcvj98z2#
看起来
componentDidMount
和componentDidUpdate
的组合可以完成这项工作。第一个函数在初始渲染之后调用,当DOM可用时,第二个函数在任何后续渲染之后调用,一旦更新的DOM可用。在我的例子中,我将它们都委托给一个公共函数来做同样的事情。yrefmtwq3#
componentDidMount
和componentDidUpdate
的组合可以用类组件来完成代码的工作,但是如果你用函数组件来编写代码,the Effect Hook
会做得很好,它和componentDidMount
和componentDidUpdate
是一样的。https://reactjs.org/docs/hooks-effect.html
qlvxas9a4#
我对表应用了componentDidUpdate,使所有列的高度相同。它的工作原理与jquery中的$(window).load()相同。
例如:
lndjwyie5#
我发现,只需在
componentDidMount
或componentDidUpdate
中用时间为0毫秒的setTimeout
Package 代码,就可以确保在执行setTimeout
函数之前,浏览器DOM已经用React更改进行了更新。就像这样:
这会将匿名函数放在JS事件队列中,以便在当前运行的React堆栈帧完成后立即运行。
bwitn5fc6#
在现代浏览器中,它应该像这样
u1ehiz5o7#
对我来说似乎起作用了
0dxa2lsx8#
下面是我在尝试使用document.getElementsByClassName获取类之前等待DOM准备好的结果。我从componentDidMount()生命周期方法调用了此函数。
6mw9ycah9#
在下面的app.js [初始js文件]中添加以下代码,它将检测窗口刷新: