前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >react 使用 useEffect 方法替代生命周期API componentDidMount,componentDidUpdate 和 componentWillUnmount

react 使用 useEffect 方法替代生命周期API componentDidMount,componentDidUpdate 和 componentWillUnmount

作者头像
fastmock
发布2022-07-13 18:10:03
发布2022-07-13 18:10:03
2.3K00
代码可运行
举报
文章被收录于专栏:fastmockfastmock
运行总次数:0
代码可运行

useEffectreact 新版本推出的一个特别常用的 hooks 功能之一,useEffect 可以在组件渲染后实现各种不同的副作用,它使得函数式组件同样具备编写类似类组件生命周期函数的功能.

因为useEffect只在渲染后执行,所以useEffect只能替代render后的生命周期函数。即componentDidMount,componentDidUpdate 和 componentWillUnmount

1、只传入回调函数的useEffect -> componentDidUpdate。

只为useEffect传入回调函数一个参数时,回调函数会在每次组件重新渲染后执行,即对应于componentDidUpdate。

使用方法如下

代码语言:javascript
代码运行次数:0
运行
复制
useEffect(() => console.log('updated...'));

在使用这个方式的useEffect时,要特别注意在回调函数内部避免循环调用的问题,比如useEffect回调函数内部改变了state,state的更新又触发了useEffect。

2、传入第二个数组类型的参数指定要响应的state数据

为useEffect传入第二个参数,第二个参数是一个包含了state对象的数组,useEffect只会在数组内的一个或多个state发生变化并且重新渲染了组件后执行传入的回调函数

代码语言:javascript
代码运行次数:0
运行
复制
const [count, setCount] = useState(0);
useEffect(()=>{
    console.log(count);
}, [count])

如上代码,只有在count的值发生更改时,回调函数才会执行,或者会跳过。用这个方法可以减少不必要的操作。

3、传入第二个参数[]

这个方式依托于上面的方式理解说简单也简单说不简单也不简单。

官方的解释是

如果你传入了一个空数组([]),effect 内部的 props 和 state 就会一直拥有其初始值。

这样理解就相对简单了,意思就是只会在组件初始化时执行一次,后面的state和props的改变都不会执行了。 这就会让我们很自然想到我们用得几乎最多的componentDidMount钩子函数了。代码如下

代码语言:javascript
代码运行次数:0
运行
复制
const [count, setCount] = useState(0);
useEffect(()=>{
    console.log(count);
}, [])

4、在useEffect的回调函数中return一个匿名函数实现componentWillUnmount

这个使用方法是固定用法,就不做过多说明,示例也粘贴至官网示例,这里大概提一下:

结合上面的方法,如果在示例中传入和不传入第二个参数的区别

  • 不传第二个参数:return函数中的清除操作发生在下一次effect之前
  • 传入第二个参数:return函数中的清除操作发生在下一次effect之前,只是下个effect多了一个state控制。
  • 传入空数组,相当于useEffect回调函数=>componentDidMount - return的函数=>componentWillUnmount
代码语言:javascript
代码运行次数:0
运行
复制
function FriendStatus(props) {
  // ...
  useEffect(() => {
    // ...
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、只传入回调函数的useEffect -> componentDidUpdate。
  • 2、传入第二个数组类型的参数指定要响应的state数据
  • 3、传入第二个参数[]
  • 4、在useEffect的回调函数中return一个匿名函数实现componentWillUnmount
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档