查看: 98|回复: 0

react useCallback的常规使用方式?

[复制链接]

6

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2009-8-17
发表于 2020-10-13 14:55:00 | 显示全部楼层 |阅读模式

怎么使用好useCallback,来达到减少render次数的效果

react优化方式

  1. 减少render次数
  2. 减少计算量
  • 下面的代码,当handleClick1时间触发时,PageB组件也会重新渲染
import React, { memo, useCallback, useState } from 'react'

function PageA (props) {
  const { onClick, children } = props
  console.log(111, props)
  return <div onClick={onClick}>{children}</div>
}

function PageB ({ onClick, name }) {
  console.log(222)
  return <div onClick={onClick}>{name}</div>
}

function UseCallback() {
  const [a, setA] = useState(0)
  const [b, setB] = useState(0)

  const handleClick1 = () => {
    setA(a + 1)
  }

  const handleClick2 =() => {
    setB(b + 1)
  }

  return (
    <>
      <PageA onClick={handleClick1}>{a}</PageA>
      <PageB onClick={handleClick2} name={b} />
    </>
  )
}

export default UseCallback
  • 使用useCallback进行处理
  1. 点击事件handleClick1触发时,PageB组件也会重新渲染,当PageB组件比较耗时时,就会造成新能问题
  2. PageB组件重新渲染的原因在于每次重新渲染,onClick都会重新定义,即上次的与这次的不一致
  3. 思路:通过useCallback包裹onClick来达到缓存的效果,即useCallback的依赖项不变时不重新生成
  4. 用过memo方法包裹PageB组件,并且通过useCallback包裹PageB组件的onClick方法,memo与PureComponent比较类似,前者是对Function Component的优化,后者是对Class Component的优化,都会对传入组件的数据进行浅比较,useCallback则会保证handleClick2不会发生变化
import React, { memo, useCallback, useState } from 'react'

function PageA (props) {
  const { onClick, children } = props
  console.log(111, props)
  return <div onClick={onClick}>{children}</div>
}

function PageB ({ onClick, name }) {
  console.log(222)
  return <div onClick={onClick}>{name}</div>
}

const PageC = memo(PageB)

function UseCallback() {
  const [a, setA] = useState(0)
  const [b, setB] = useState(0)

  const handleClick1 = () => {
    setA(a + 1)
  }

  const handleClick2 = useCallback(() => {
    setB(b + 1)
  }, )

  return (
    <>
      <PageA onClick={handleClick1}>{a}</PageA>
      <PageC onClick={handleClick2} name={b} />
    </>
  )
}

export default UseCallback


来源:https://www.cnblogs.com/sk-3/p/13808854.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部