生命周期方法和 useEffect 钩子有什么区别?

Don*_*oni 5 reactjs react-hooks

在 Components 类中,我们使用 componentDidMount、componentDidUpdate 生命周期方法来更新状态。前任)

componentDidMount() {
    document.title = `You clicked ${this.state.count} times`;
}

componentDidUpdate() {
    document.title = `You clicked ${this.state.count} times`;
}
Run Code Online (Sandbox Code Playgroud)

它在每次渲染(componentDidUpdate)之后运行,包括第一次渲染(componentDidMount)。在 useEffect 钩子中,我们可以像这样实现这个功能

useEffect(() => {
    document.title = `You clicked ${count} times`;
});
Run Code Online (Sandbox Code Playgroud)

这2种方法效果一样吗?

我读了 Reactjs.org 的这一部分,并且在 React.js vs 16 上尝试过。我认为这两种方法具有相同的效果。

useEffect(() => {
    document.title = `You clicked ${count} times`;
});
Run Code Online (Sandbox Code Playgroud)

Din*_*mar 5

在 React 中,当您使用基于类的组件时,您可以访问生命周期方法(如 componentDidMount、componentDidUpdat 等)。但是,当您想要使用功能组件并且还想使用生命周期方法时,那么使用 useEffect 您可以实现这些生命周期方法。

对于您的问题,当您使用基于类的组件时,您已经预先定义了所有生命周期方法,并且它们相应地触发,但是使用 useEffect 您还需要根据您想要实现的生命周期方法使其发挥作用。请参阅下面的示例。

//--------Using a class based component.

import React, { Component } from 'react'
export default class SampleComponent extends Component {
  componentDidMount() {
    // code to run on component mount
  }
render() {
    return (<div>foo</div>)
  }
}

//-----------Using a functional component

import React, { useEffect } from 'react'
const SampleComponent = () => {
  useEffect(() => {
    // code to run on component mount
  }, [])
return (<div>foo</div>)
}
export SampleComponent
Run Code Online (Sandbox Code Playgroud)

它们几乎相同,但最大的区别在于实现,在那里(基于类的组件)您有使用生命周期方法的自定义函数,但在这里(基于函数的组件)您使用 useEffect 手动实现您正在使用的每个函数。但开发人员选择函数式组件而不是基于类的组件,因为函数式组件被认为比 CBC 更快。(React 函数式组件快 45%