React-Hooks-useCallback

简介: React-Hooks-useCallback

前言


useCallback 是 React 中的一个 Hooks,它用于优化性能,避免不必要的函数重新创建。在函数组件中,当一个函数作为 props 传递给子组件时,如果该函数在每次渲染时都重新创建,可能会导致子组件重新渲染,从而影响性能。




useCallback Hook 概述


  • useCallback 是用于优化代码, 可以让对应的函数只有在依赖发生变化时才重新定义

首先来看如下这么一个案例,大致内容为,在 App 组件当中引用了两个组件,然后在使用 useState 定义状态,在 App 当中可以进行增加和减少,在其它两个组件当中也可以进行同样的操作:

import React, {useState, memo} from 'react';
function Home(props) {
    console.log('Home被渲染了');
    return (
        <div>
            <p>Home</p>
            <button onClick={() => {
                props.handler()
            }}>Home增加
            </button>
        </div>
    )
}
function About(props) {
    console.log('About被渲染了');
    return (
        <div>
            <p>About</p>
            <button onClick={() => {
                props.handler()
            }}>About减少
            </button>
        </div>
    )
}
const MemoHome = memo(Home);
const MemoAbout = memo(About);
export default function App() {
    console.log('App被渲染了');
    const [numState, setNumState] = useState(0);
    const [countState, setCountState] = useState(0);
    function increment() {
        setNumState(numState + 1);
    }
    function decrement() {
        setCountState(countState - 1);
    }
    return (
        <div>
            <p>numState = {numState}</p>
            <p>countState = {countState}</p>
            <button onClick={() => {
                increment()
            }}>App增加
            </button>
            <button onClick={() => {
                decrement()
            }}>App减少
            </button>
            <MemoHome handler={increment}/>
            <MemoAbout handler={decrement}/>
        </div>
    )
}


然后博主在运行了项目之后在进行增加和减少的过程当中发现,在 App 当中增加和在其它两个组件增加和减少都会触发 3 个组件全部重新渲染了,这就是 state 的一个机制,当前 Home 和 About 重新渲染的原因是因为,父组件中的数据发生了变化, 会重新渲染父组件,重新渲染父组件, 就会重新执行父组件函数,重新执行父组件函数, 就会重新定义 increment/decrement 既然 increment/decrement 是重新定义的, 所以就和上一次的不是同一个函数了, 既然不是同一个函数, 所以 Home 和 About 接收到的内容也和上一次的不一样了, 既然接收到的内容和上一次不一样了, 所以就会重新渲染。那么解决该问题就可以使用本章所介绍的 useCallback 来进行编写, 更改 decrement 方法,用他来举例子:

import React, {useCallback} from 'react';


只要 countState 没有发生变化, 那么 useCallback 返回的永远都是同一个函数:

const decrement = useCallback(() => {
    setCountState(countState - 1);
}, [countState]);


然后经过这么一个改造过后呢,再去浏览器测试你会发现,在增加的时候,About 组件没有被重新渲染,这个我不把测试过程列举出来了。




最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
Java Spring
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
|
11月前
|
网络协议 算法
RPC为何比较高效?
RPC为何比较高效?
187 0
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
297 8
|
资源调度 PyTorch 算法框架/工具
pytorch 如何生成指定位置、尺度参数的随机高斯矩阵,并指定这个随机矩阵的形式
在上述代码中,我们使用 torch.normal(mean=mu, std=sigma, size=(m, n)) 函数直接生成了一个形状为 (m, n) 的随机高斯矩阵 data,其中 mean 参数指定了均值,std 参数指定了标准差。 需要注意的是,与 torch.randn() 不同,torch.normal() 生成的是具有指定均值和标准差的高斯分布,因此生成的随机矩阵不一定是标准正态分布。如果需要生成标准正态分布随机矩阵,可以将 mean 参数设置为 0,std 参数设置为 1。
1430 1
我真想和偷卖源码的人打一架
1,系统的演示;2,系统的核心代码;3,系统源码获取
224 0
我真想和偷卖源码的人打一架
|
Kubernetes Perl 容器
k8s网络
一、概述   k8s从Docker网络模型(NAT方式的网络模型)中独立出来形成一套新的网络模型。该网络模型的目标是:        每一个Pod都拥有一个扁平化共享网络命名空间的IP,称为PodIP,通过PodIP, Pod能够跨网络与其他物理机和Pod进行通信。
3435 0
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
591 21