reactjs 在react.js中加载DOM时回调

8mmmxcuj  于 2023-01-12  发布在  React
关注(0)|答案(9)|浏览(162)

我希望在react.js组件的DOM元素(包括所有子节点)实际加载到页面上并准备就绪时,在该组件上调用回调函数。具体来说,我有两个组件,希望呈现相同的大小,选择自然大小较大的组件中的最大值。
看起来componentDidMount并不是我真正想要的,因为每个组件只调用它一次,但我希望在组件完成渲染时再次调用回调函数。我以为可以在顶层DOM元素中添加一个onLoad事件,但我猜这只适用于某些元素,如<body><img>

elcex8rz

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
 }
}
tzcvj98z

tzcvj98z2#

看起来componentDidMountcomponentDidUpdate的组合可以完成这项工作。第一个函数在初始渲染之后调用,当DOM可用时,第二个函数在任何后续渲染之后调用,一旦更新的DOM可用。在我的例子中,我将它们都委托给一个公共函数来做同样的事情。

yrefmtwq

yrefmtwq3#

componentDidMountcomponentDidUpdate的组合可以用类组件来完成代码的工作,但是如果你用函数组件来编写代码,the Effect Hook会做得很好,它和componentDidMountcomponentDidUpdate是一样的。

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

qlvxas9a

qlvxas9a4#

我对表应用了componentDidUpdate,使所有列的高度相同。它的工作原理与jquery中的$(window).load()相同。
例如:

componentDidUpdate: function() {
        $(".tbl-tr").height($(".tbl-tr ").height());
    }
lndjwyie

lndjwyie5#

我发现,只需在componentDidMountcomponentDidUpdate中用时间为0毫秒的setTimeout Package 代码,就可以确保在执行setTimeout函数之前,浏览器DOM已经用React更改进行了更新。
就像这样:

componentDidMount() {
    setTimeout(() => {
        $("myclass") //  $ is available here
    }, 0)
}

这会将匿名函数放在JS事件队列中,以便在当前运行的React堆栈帧完成后立即运行。

bwitn5fc

bwitn5fc6#

在现代浏览器中,它应该像这样

try() {
     if (!$("#element").size()) {
       window.requestAnimationFrame(try);
     } else {
       // do your stuff
     }
};

componentDidMount(){
     this.try();
}
u1ehiz5o

u1ehiz5o7#

对我来说似乎起作用了

const [isLoaded, setIsLoaded] = useState(false);
const [isPageLoaded, setIsPageLoaded] = useState(false); //this helps

useEffect(() => {
    setIsLoaded(true);
}, []);

useEffect(() => {
    if (isLoaded) {
        setIsPageLoaded(true);
    }
}, [isLoaded]);
0dxa2lsx

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);
            }
     }
6mw9ycah

6mw9ycah9#

在下面的app.js [初始js文件]中添加以下代码,它将检测窗口刷新:

window.onload = () => {
      if (window.location.pathname != "/") {
        window.location = "/";
      }
    };

// const App = (props) => {

相关问题