最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React 避免不必要的更新(函数组件)

    正文概述 掘金(没事写点啥)   2020-12-30   611

    避免子组件的不必要更新

    使用memo()对函数组件进行缓存,使其只有在props变化时重新执行。

    不必要的赋值

    缓存引用类型

    当组件执行时,会对组件中的所有变量重新初始化。如下代码:

    const myComponent = ()=>{
        const data = [{...},...]
        const [n,setN] = useState(0) 
        return (
        <>
        <button onClick={()=>setN(n+1)}>increment</button>	
        <List dataSource={data}/> // 假设List组件是由memo(List)导出
        </>
        )
    }
    

    每次点击 increment 按钮都会出发 myComponent 组件的执行,从而导致 data 的从新初始化。而 List 组件发现 dataSource属性的引用地址发生了变化就会导致组件重新执行。

    使用useMemo缓存data引用的地址,有效的避免组件执行时不必要的更新引用的变量

    const data = useMemo(()=>[{...},...],[])
    

    缓存函数

    至此我们发现了变量的初始化会导致组件的重新渲染,那么上面的代码中视乎还存在一个问题 <button onClick={()=>setN(n+1)}>increment</button>,这里将箭头函数直接写死在了元素上,那么每次执行都会重新创建一个 “新的” 箭头函数。如果当前的组件不是一个元素而是一个组件的话同样会导致组件的不必要执行。

    使用useCallback缓存函数,只有在n变化的时候对函数更新

    <button onClick={useCallback(()=>setN(n+1),[n])}>increment</button>
    

    可读性上的问题可以通过将代码从模板中抽离解决。

    总结

    总的来说一句话。在函数组件中等于号右边的初始化操作都需要加上 use 前缀(希望读者能够在工作中很好运用起来)。例如

    const fn = useCallback(()=>{},[])
    
    const columns = useMemo(()=>({}),[]) //返回对象时需要使用括号包裹
    
    const [state,setState] = useState()
    

    起源地下载网 » React 避免不必要的更新(函数组件)

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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