最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 从useEffect中使用debounce来了解部分react hooks

    正文概述 掘金(sun142725)   2021-02-06   1046

    从useEffect中使用debounce来了解部分react hooks

    踩坑历程

    debounce一般使用

    import debounce from 'lodash/debounce'
    
    debounce(()=>search(value), 500)
    

    测试发现这一套在useEffect里是行不通的,我们对它做以下处理

    import debounce from 'lodash/debounce'
    
    
    
    const [value, setValue] = useState('')
    <!--搜索函数-->
    const search = (value)=>{
        console.log(value)
        <!--调用接口-->
    }
    
    <!--防抖处理-->
    <!--处理方案一-->
    const debounceFn = useCallback(
      debounce(callback => {
        callback()
      }, 1000),
      []
    )
    <!--value值变化触发-->
    useEffect(() => {
        debounceFn(()=>search(params))
    }, [value])
    

    测试一下,发现一秒未操作触发search函数 => 成功

    简单优化一下

    <!-- 处理方案二 -->
        const debounceFn = function(delay){
            return useCallback(
              debounce(callback => {
                callback()
              }, delay),
              []
            )
        }
    <!--调用方法-->
    const debounceSearch = debounceFn(500)
    debounceSearch(()=>search(params))
    
    <!--或者直接在useEffect中实现debounce-->
    <!--处理方案三-->
    useEffect(() => {
        // debounceSearch(params)
    let timer;
    return (...args) => {
      clearTimeout(timer);
      timer = setTimeout(()=>handleParams(params), 500,...args);
    }
    

    最后,封装自定义hooks (最佳解决方案)

    <!--处理方案四-->
    import { useEffect } from 'react'
    function useDebounce(fn, delay, dep=[]) {
       useEffect(()=>{
          let timer;
          timer = setTimeout(fn, delay);
          return ()=>clearTimeout(timer); // 这里用到useEffect清除的能力 类似于componentWillUnmount
       }, [...dep]
      )
    }
    export default useDebounce
    

    资料研究

    涉及到知识点debounce useEffect useCallback

    • debounce
    function debounce(fn, wait=1000){
        let timer;
        return () => {
            clearTimeout(timer);
            timer = setTimeout(fn, wait);
        } 
    }
    
    • useEffect
    // useEffect替代了之前的`componentDidMount`和`componentDidUpdate`
    useEffect(()=>{
        console.log('我执行了')
        window.addEventListener('scroll', ()=>{})
        return ()=>window.removeEventListener('scroll', ()=>{})  // return里的函数代表清除副作用,类似于之前在componentWillUnmount钩子里做的事情
    }, [...dep]) // dep为监测state的数组,当所依赖state内容变化时触发组件更新useEffect钩子,若为空,每次进入或组件update时都会触发
    

    初次发文,还请各位大佬多多担待,有用的到的还请手留余香,点个赞


    起源地下载网 » 从useEffect中使用debounce来了解部分react hooks

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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