当前位置: 首页 > 面试题库 >

React Hook和等效组件生命周期

葛勇锐
2023-03-14
问题内容

什么是的等同
componentDidMountcomponentDidUpdatecomponentWillUnmount使用生命周期的钩子钩反应一样useEffect


问题答案:

componentDidMount

传递一个空数组作为第二个参数,useEffect()以仅在安装时仅运行回调。

function ComponentDidMount() {

  const [count, setCount] = React.useState(0);

  React.useEffect(() => {

    console.log('componentDidMount');

  }, []);



  return (

    <div>

      <p>componentDidMount: {count} times</p>

      <button

        onClick={() => {

          setCount(count + 1);

        }}

      >

        Click Me

      </button>

    </div>

  );

}



ReactDOM.render(

  <div>

    <ComponentDidMount />

  </div>,

  document.querySelector("#app")

);


<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>



<div id="app"></div>

componentDidUpdate

componentDidUpdate()更新发生后立即调用。初始渲染不调用此方法。useEffect在每个渲染(包括第一个)上运行。因此,如果要使用严格等同于componentDidUpdate,则必须使用useRef确定组件是否已安装一次。如果您想要更严格,请使用useLayoutEffect(),但它会同步触发。在大多数情况下,useEffect()应该足够了。

这个答案受到Tholle的启发,所有功劳归他所有。

function ComponentDidUpdate() {

  const [count, setCount] = React.useState(0);



  const isFirstUpdate = React.useRef(true);

  React.useEffect(() => {

    if (isFirstUpdate.current) {

      isFirstUpdate.current = false;

      return;

    }



    console.log('componentDidUpdate');

  });



  return (

    <div>

      <p>componentDidUpdate: {count} times</p>

      <button

        onClick={() => {

          setCount(count + 1);

        }}

      >

        Click Me

      </button>

    </div>

  );

}



ReactDOM.render(

  <ComponentDidUpdate />,

  document.getElementById("app")

);


<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>



<div id="app"></div>

componentWillUnmount

在useEffect的callback参数中返回一个回调,它将在卸载之前被调用。

function ComponentWillUnmount() {

  function ComponentWillUnmountInner(props) {

    React.useEffect(() => {

      return () => {

        console.log('componentWillUnmount');

      };

    }, []);



    return (

      <div>

        <p>componentWillUnmount</p>

      </div>

    );

  }



  const [count, setCount] = React.useState(0);



  return (

    <div>

      {count % 2 === 0 ? (

        <ComponentWillUnmountInner count={count} />

      ) : (

        <p>No component</p>

      )}

      <button

        onClick={() => {

          setCount(count + 1);

        }}

      >

        Click Me

      </button>

    </div>

  );

}



ReactDOM.render(

  <div>

    <ComponentWillUnmount />

  </div>,

  document.querySelector("#app")

);


<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>



<div id="app"></div>


 类似资料:
  • 一般来说,一个组件类由 extends Component 创建,并且提供一个 render 方法以及其他可选的生命周期函数、组件相关的事件或方法来定义。 {% include './share/simple-component.md' %} getInitialState 初始化 this.state 的值,只在组件装载之前调用一次。 如果是使用 ES6 的语法,你也可以在构造函数中初始化状态,

  • 主要内容:挂载,更新,卸载,实例,实例,React 实例,React 实例在本章节中我们将讨论 React 组件的生命周期。 组件的生命周期可分成三个状态: Mounting(挂载):已插入真实 DOM Updating(更新):正在被重新渲染 Unmounting(卸载):已移出真实 DOM 挂载 当组件实例被创建并插入 DOM 中时,其生命周期调用顺序如下: : 在 React 组件挂载之前,会调用它的构造函数。 : 在调用 render 方法之前调用,并且在初始挂

  • 与React 组件一样,Rx组件同样具备以下生命周期 组件加载: componentWillMount 组件加载: componentDidMount 组件更新: componentWillReceiveProps 组件更新: shouldComponentUpdate 组件更新: componentWillUpdate 组件更新: componentDidUpdate 组件卸载: compone

  • - 当输入绑定值更改时调用 ngOnInit - 第一次ngOnChanges之后 ngAfterContentInit - 组件内容初始化之后 ngAfterContentChecked - 在每次检查组件内容后 ngAfterViewChecked - 在每次检查组件视图后 ngOnDestroy - 只在组件被销毁之前

  • Aurelia使用组件生命周期方法来操纵组件生命周期。 在本章中,我们将向您展示这些方法并解释组件生命周期。 constructor() - 构造方法用于初始化使用类创建的对象。 首先调用此方法。 如果未指定此方法,则将使用默认构造函数。 created(owningView, myView) - 一旦创建视图和视图模型并将其连接到控制器,就会调用此方法。 此方法有两个参数。 第一个是声明组件的视

  • 组件的生命周期包含三个根据渲染方案执行的方法。 在初始渲染 init didReceiveAttrs willRender didInsertElement didRender On Re-Render didUpdateAttrs didReceiveAttrs willUpdate willRender didUpdate didRender 关于组件破坏 willDestroyElement