最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React Hook 学习笔记之-useEffect

    正文概述 掘金(卡卡罗特酷酷一麻袋)   2020-12-11   375

    执行初始化操作的时机

    一般来说,业务组件经常会遇到要通过发起ajax请求来获取业务数据并且执行初始化操作的场景。 在使用class component编程时,我们就可以在class component提供的生命周期钩子函数(比如componentDidMount,constructor等)执行这个操作。如果转到React hooks之后,function component里是没有生命周期钩子函数的,那这个初始化操作怎么办呢?总不能每次遇到这种场景都使用class component来做吧?

    解决方案:使用useEffect(想知道useEffect是什么的话,可以点击这里)

    useEffect,就是执行有副作用的操作,你可以把它当成componentDidMount,componentDidUpdate,和componentWillUnmount的集合.它的函数声明如下

    useEffect(effect: React.EffectCallback, inputs?: ReadonlyArray<any> | undefined)
    
    import React,{useEffect} from 'react'
    export function BusinessComponent(){
    	const initData = async() => {
        	// 发起请求并执行初始化操作
        }
        // 执行初始化操作,需要注意的是,如果你只是想在渲染的时候初始化一次数据,那么第二个参数必须传空数组。
        useEffect(()=>{
          initData();
        }, []);
        return (<div></div>)
    }
    

    需要注意的是,这里的useEffect的第二个参数必须传空数组,这样它就等价于只在componentDidMount的时候执行。如果不传第二个参数的话,它就等价于componentDidMountcomponentDidUpdate

    做一些清理操作

    由于我们在实际开发中,经常会遇到需要做一些副作用的场景,比如轮训操作(定时器、轮训请求等)、使用浏览器原生的事件监听机制而不用react的事件机制(这种情况下,组件销毁的时候,需要用户主动去取消事件监听)等。使用class component编程的时候,我们一般都在componentWillUnmount(卸载阶段)的时候去做清理操作,可是使用react hooks的时候,我们要如何处理?

    解决方案:使用useEffect第一个参数的返回值(return)

    如果useEffect的第一个参数返回了函数的时候,react会在每一次执行新的effects之前执行这个函数来做一些清理操作。因此,我们可以使用它来执行一些清理操作。

    例子:比如我们要做一个二维码组件,我们需要根据传入的userId不断轮询地向后台发请求查询扫描二维码的状态,这种情况下,我们就需要在组件unmount的时候清理掉轮询操作。代码如下:

    import React, { useEffect } from 'react'
    
    export function QRCode(url, userId) {
      // 根据userId查询扫描状态
      const pollingQueryingStatus = async () => {
      }
      // 取消轮询
      const stopPollingQueryStatus = async() => {
      }
    
      useEffect(() => {
        pollingQueryingStatus();
    
        return stopPollingQueryStatus;
      }, []);
    
      // 根据url生成二维码
      return (<div></div>)
    }
    
    

    但是,有时候我们可能需要执行多次清理操作。还是举上面的例子,我们需要在用户传入新的userId的时候,去执行新的查询的操作,同时我们还需要清除掉旧的轮询操作。想一下怎么做比较好。 其实对这种情况,官方也已经给出了解决方案了,useEffect的第二个参数是触发effects的关键,如果用户传入了第二个参数,那么只有在第二个参数的值发生变化(以及首次渲染)的时候,才会触发effects。因此,我们只需要将上面的代码改一下:

    mport React, { useEffect } from 'react'
    
    export function QRCode(url, userId) {
      // 根据userId查询扫描状态
      const pollingQueryingStatus = async () => {
      }
    
      const stopPollingQueryStatus = async() => {
      }
      // 我们只是将useEffect的第二个参数加了个userId
      useEffect(() => {
        pollingQueryingStatus();
    
        return stopPollingQueryStatus;
      }, [userId]);
    
      // 根据url生成二维码
      return (<div></div>)
    }
    

    我们只是在useEffect的第二个,加入一个userId.这样的话,userId的每一次变化都会先触发stopPollingQueryStatus,之后再执行effects。

    借鉴:可乐好喝不胖


    起源地下载网 » React Hook 学习笔记之-useEffect

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元