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

bri*_*rns 54 reactjs

我希望在我的react.js组件上调用一个回调,当它的DOM元素(包括所有子节点)实际上已加载到页面上并准备就绪时.具体来说,我有两个组件,我想渲染相同的大小,选择具有较大自然大小的任何组件的最大值.

它看起来componentDidMount不是我真正想要的,因为每个组件只调用一次,但我希望在组件完成渲染时再次调用我的回调.我以为我可以onLoad向顶级DOM元素添加一个事件,但我想这只适用于某些元素,比如<body><img>.

bri*_*rns 45

看起来像是组合componentDidMount并将componentDidUpdate完成工作.第一个在初始渲染之后调用,当DOM可用时,第二个在任何后续渲染之后调用,一旦更新的DOM可用.在我的情况下,我都让他们委托一个共同的功能来做同样的事情.

  • 但是componentDidUpdate将被多次调用,这是不可行的 (2认同)
  • @brianmearns 在使用像 redux 这样的状态管理库时,父道具可以更改多次,并且每次 componentDidUpdate 都会被调用。如果我们只需要等待初始 DOM 渲染,在这种情况下将不可行。在这种情况下,在 componentDidMount 中附加负载侦听器似乎更好,如以下答案之一所示。 (2认同)

Joh*_*ohn 41

在componentDidMount中添加onload侦听器

class Comp1 extends React.Component {
 constructor(props) {
    super(props);
    this.handleLoad = this.handleLoad.bind(this);
 }

 componentDidMount() {
    window.addEventListener('load', this.handleLoad);
 }

 handleLoad() {
  $("myclass") //  $ is available here
 }
}
Run Code Online (Sandbox Code Playgroud)

  • 还记得添加remove eventlistener`componentWillUnmount(){window.removeEventListener('load',this.handleLoad)}` (8认同)

小智 18

的组合componentDidMount,并componentDidUpdate会得到与类组件的代码完成任务。但是如果你在全功能组件中编写代码the Effect Hook会做得很好,它与componentDidMountand相同componentDidUpdate

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>
  );
}
Run Code Online (Sandbox Code Playgroud)

https://reactjs.org/docs/hooks-effect.html

  • 我喜欢这个答案的方向,但是你的例子并不能解决问题。 (4认同)
  • 我认为这个问题与加载事件有关。使用 useEffect 钩子,您可以检测用户访问“view/page/....”的时刻,您不必等待所有元素都出现在屏幕上 (3认同)

小智 6

我将componentDidUpdate应用于表以使所有列具有相同的高度.它与jquery中的$(window).load()相同.

例如:

componentDidUpdate: function() {
        $(".tbl-tr").height($(".tbl-tr ").height());
    }
Run Code Online (Sandbox Code Playgroud)

  • 为什么在react中使用jquery?作者要求React解决方案,因此不需要引入新的额外依赖项,这些依赖项实际上根本没有用 (3认同)

小智 5

我发现,简单地将代码包装在componentDidMount或 中componentDidUpdatesetTimeout时间为 0 毫秒可确保浏览器 DOM 在执行setTimeout函数之前已使用 React 更改进行更新。

像这样:

componentDidMount() {
    setTimeout(() => {
        $("myclass") //  $ is available here
    }, 0)
}
Run Code Online (Sandbox Code Playgroud)

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