揭秘React useEffect

2,848 阅读2分钟

下面是关于React的useEffect的快速解释!我的假设是你已经熟悉了React中类组件的工作方式,所以我将解释一下hooks的等价物是什么 🚀。

让我们直接说吧。

useEffect vs componentDidMount

在React中,使用的两种最常见的生命周期方法是 componentDidMountcomponentDidUpdate。后者主要用于当你的属性与父体发生变化时,而子体必须响应更新。前者主要用于向服务器发出外部HTTP请求以获取数据。例如,你可以像这样从jsonplaceholder(免费的API工具)获取数据:

import React from 'React';

class App extends React {
  componentDidMount{
    fetch('https://jsonplaceholder.typicode.com/todos/1')
      .then(response => response.json()) 
      .then(json => console.log(json))
    }
  }
}

它在组件挂载后获取数据,并将其记录到控制台,那么,在hooks中相当于什么呢?

让我们回顾一下,在hook的世界出现之前,我们有(现在仍然有)另一种写React的方法。“函数组件”或无状态组件,如:

const Footer = () => {
  return (
    <div>
     <h1>Dude, I'm a footer<h1>
    </div>
  )
}
export default Footer

你可以传递props,并在这些props中使用回调函数来修改父级的状态。

const Footer = (props) => {
  return (
    <div>
      <h1>{props.title}</h1>
      <button onClick={props.callback}>Callback Function</button>
    </div>
  )
}
export default Footer

当你编写React Hook时,你是在以上述函数风格编写组件,但通过“Hook”将其与类组件的强大功能结合在一起。

让我们回到带有 componentDidMount 的原始示例。这是用hooks编写的方式:

import {useEffect} from 'React';

const App = (props) => {
  useEffect(() => {
    fetch('https://jsonplaceholder.typicode.com/todos/1')
      .then(response => response.json()) 
      .then(json => console.log(json))
    }
  },[]);
}

这运行一次。我们在末尾指定 [] 以表示它只运行一次。

useEffect vs ComponentDidUpdate

上面最后一个参数 [] 实际上是控制 useEffect 代码被运行的频率。那么,如何将其转化为 componentDidUpdate 呢?

componentDidUpdate 的一种常见用例是从父组件更改了prop产生了副作用。

这是一个例子:

import react from "React";

class App extends React {
 componentDidUpdate(previousProps){
  if(previousProps.visible !== this.props.visible) {
    // execute changes
  } 
}

我们在这里所做的是检查当前传入的 this.props 是否已从 previousProps 更改。如果 prop.visible 确实发生了更改,请执行代码更改。

Hook上的等价是什么?

import {useEffect} from "React";

const App = (props) => {
 useEffect(()=> {
  // execute changes
 }, [props.visible]);
}

[props.visible] 充当各种观察者,以指定useEffect应该何时运行。在这种情况下,仅当 props.visible 被修改时。

useEffect vs componentDidMount/componentDidUpdate

就像最后一个注释一样,如果你在 useEffect 的最后一个参数中未指定任何内容

import {useEffect} from "React";

const App = (props) => {
 useEffect(()=> {
   // 这基本上是componentDidMount + componentDidUpdate的组合
   // 它在componentDidMount上执行一次,并且在任何状态变量从useState更新时执行
 });
}

实际上,你已经将 componentDidMountcomponentDidUpdate 全部结合在一起。


来源:www.vincentntang.com,作者:vincentntang,翻译:公众号《前端全栈开发者》