react useCallback的常规使用方式?
怎么使用好useCallback,来达到减少render次数的效果
react优化方式
- 减少render次数
- 减少计算量
- 下面的代码,当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进行处理
- 点击事件handleClick1触发时,PageB组件也会重新渲染,当PageB组件比较耗时时,就会造成新能问题
- PageB组件重新渲染的原因在于每次重新渲染,onClick都会重新定义,即上次的与这次的不一致
- 思路:通过useCallback包裹onClick来达到缓存的效果,即useCallback的依赖项不变时不重新生成
- 用过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)
}, [b])
return (
<>
<PageA onClick={handleClick1}>{a}</PageA>
<PageC onClick={handleClick2} name={b} />
</>
)
}
export default UseCallback
分类:
react
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!