React useEffect的理解与使用

 更新时间:2021年04月19日 10:47:58   作者:RedCHr  
这篇文章主要介绍了React useEffect的理解与使用,帮助大家更好的理解和学习使用React,感兴趣的朋友可以了解下

React16.8新增的useEffec这个hook函数就是处理副作用的。

所谓的“副作用”,举个通俗一点的例子,假如感冒了本来吃点药就没事了,但是吃了药发现身体过敏了,而这个“过敏”就是副作用。

放到React中,本来只是想渲染DOM展示到页面上,但除了DOM之外还有数据,而这些数据必须从外部的数据源中获取,这个“获取外部数据源”的过程就是副作用。

useEffect怎么用可以参考官网给出的例子,这里主要针对使用useEffect过程中遇到的问题进行总结。

避免重复循环渲染

利用useEffect接收一个数组作为第二个参数,将第二个参数作为dependence,每次渲染完DOM执行副作用函数时都会浅比较dependence渲染前后的值是否一致,不一致就执行副作用,反之就不执行;如果该dependence为一个空数组[],即没有传入比较变化的变量,则比较结果永远都保持不变,那么副作用逻辑就只能执行一次。

useEffect(() => {
  setTimeout(() => {    
        setCounter(counter + 1);  
    }, 300)
}, []);

初此之外,如果我们还想通过点击刷新按钮实现获取外部数据但又不想造成死循环,那么可以通过一个变量作为“开关”,在实现目的的同时做到避免循环渲染DOM。

画动图太麻烦,各位看注释脑补😂

function App() {  const [count, setCount] = useState(0);  const [loading, setLoading] = useState(true); // loading作为开关  useEffect(() => {    if (loading) { // 注意这里只有当loading为true时才执行      setTimeout(() => {        setCount(count + 1);        setLoading(!loading); // 改变loading值      });    }  }, [loading]); // loading在这里作为dependence
  // 第一次DOM渲染完成后,loading为true,执行副作用函数,count值变为1,loading变为false,由于
  // 改变了state的值,会update,组件会再次render,但此时loading为false,不会执行setTimeout,
  // 避免了循环

  // 当点击Refresh刷新,loading由上一次的false变为了true,函数执行一次update
  // DOM更新完后执行useEffect,因为loading已经为true了,所以副作用函数可执行,count从1变为2,
  // loading又从true变为false,就这样交替进行。。。
  return (    <div>      <h3>{count}</h3>      <button        onClick={() => {          setLoading(true);        }}      >        Refresh      </button>    </div>  );}

关于副作用的清除

useEffect可以返回一个函数来作为清除副作用。

  useEffect(() => {    
    ChatAPI.subscribeToFriendStatus(props.id, handleStatusChange);  
    function clear(){
        ChatAPI.unsubscribeFromFriendStatus(props.id, handleStatusChange);
    }  
    return clear;
});

这里会涉及到useEffect执行和销毁的过程:

  1. 传入props.id = 1
  2. 组件渲染
  3. DOM渲染完成,执行副作用函数,返回清除副作用函数clear,命名为clear1
  4. 传入props.id=2
  5. 组件渲染
  6. DOM渲染完成,执行clear1
  7. 副作用函数执行并返回另一个clear函数,命名为clear2
  8. 组件销毁,clear2执行

由此可推测出副作用清除函数的特征:

  • 每次副作用执行都会返回一个清除函数
  • 清除函数会在下一次副作用函数执行之前(DOM渲染完成之后)执行
  • 组件销毁也会执行一次清除函数

从打印出的count值也可以看出,清除函数会在下一次副作用函数执行之前执行,即在清除函数里的count值是上一次缓存的count值:

进一步思考,clear1执行的时候,访问了props.id,那么这个id值是1还是2呢?

这里就涉及到闭包的知识概念了,因为useEffect返回的是个函数,在执行时产生了一个闭包,根据闭包的相关定义,返回的clear函数能访问自身作用域外的变量,当组件第一次渲染时传入id=1,此时的clear函数中的props.id值为1。

以上就是React useEffect的理解与使用的详细内容,更多关于React useEffect的资料请关注脚本之家其它相关文章!

相关文章

  • React跨端动态化之从JS引擎到RN落地详解

    React跨端动态化之从JS引擎到RN落地详解

    这篇文章主要为大家介绍了React跨端动态化之从JS引擎到RN落地,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • React使用api的方式封装弹窗的示例代码

    React使用api的方式封装弹窗的示例代码

    在现代开发中的弹窗样式,经常会是底部一个叉号样式的弹窗,但是目前组件库中并无类似弹窗组件,本文小编给大家介绍了React使用api的方式封装弹窗的示例,感兴趣的小伙伴跟着小编一起来看看吧
    2024-09-09
  • 使用react在修改state中的数组和对象数据的时候(setState)

    使用react在修改state中的数组和对象数据的时候(setState)

    这篇文章主要介绍了使用react在修改state中的数组和对象数据的时候(setState),具有很好的参考价值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • react中useEffect函数的详细用法(最新推荐)

    react中useEffect函数的详细用法(最新推荐)

    useEffect是React中的一个Hook,用于在函数组件中处理副作用(如数据获取、订阅、手动更改 DOM 等),useEffect属于组件的生命周期方法,下面通过本文给大家分享react中useEffect函数的详细用法,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • JavaScript的React Web库的理念剖析及基础上手指南

    JavaScript的React Web库的理念剖析及基础上手指南

    这篇文章主要介绍了JavaScript的React Web库的理念剖析及基础上手指南,React Web的目的即是把本地的React Native应用程序项目变为Web应用程序,需要的朋友可以参考下
    2016-05-05
  • react如何用懒加载减少首屏加载时间

    react如何用懒加载减少首屏加载时间

    这篇文章主要介绍了react如何利用懒加载减少首屏加载时间,帮助大家更好的理解和学习使用react,感兴趣的朋友可以了解下
    2021-04-04
  • React ts模式使用http-proxy-middleware代理时访问报404问题

    React ts模式使用http-proxy-middleware代理时访问报404问题

    这篇文章主要介绍了React ts模式使用http-proxy-middleware代理时访问报404问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • React component.forceUpdate()强制重新渲染方式

    React component.forceUpdate()强制重新渲染方式

    这篇文章主要介绍了React component.forceUpdate()强制重新渲染方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 解析React ref 命令代替父子组件的数据传递问题

    解析React ref 命令代替父子组件的数据传递问题

    这篇文章主要介绍了React - ref 命令为什么代替父子组件的数据传递,使用 ref 之后,我们不需要再进行频繁的父子传递了,子组件也可以有自己的私有状态并且不会影响信息的正常需求,这是为什么呢?因为我们使用了 ref 命令的话,ref是可以进行状态的传输
    2022-08-08
  • React useCallback使用教程

    React useCallback使用教程

    useCallback是react中比较重要的一个hook,useCallback 用来返回一个函数,在父子组件传参或者通用函数封装中,起到举足轻重的作用
    2023-01-01

最新评论