学会使用useMemo和useCallback对你没坏处

简介: 学会使用useMemo和useCallback对你没坏处

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

什么是useMemo?

useMemo的行为类似Vue中的计算属性,可以检测某个值的变化,根据变化值计算新值。useMemo会缓存计算结果,如果检测值没有发生变化,即使组件重新渲染,也不会重新计算,此行为可以有助于避免在每个渲染上进行昂贵的计算。不要再useMemo函数中执行与渲染无关的操作。

useMemo的基本用法

function App() {
    const [bool,setBool] = useState(true);
    const [age,setAge] = useState('666');
    const result = useMemo(() => {
        console.log('检测到age发生变化');
        return age * 2; 
    },[age])
    return (
        <div>
            {age}
            {bool ? '真': '假'}
            <button onClick={() => setBool(!bool)}>点我切换布尔值</button>
            <button onClick={() => setAge(age*1 + 1)}>点我age+1</button>
            result是:{result}
        </div>
    )
}
复制代码

memo方法

memo方法可以用于性能优化,如果本组件中的数据没有发生变化,阻止组件更新,类似类组件中的PureComponent和shouldComponentUpdate.

memo方法的基本用法

function App() {
    const [count, setCount] = useState(0);
    return (
        <div>
            <Foo />
            <h1>当前求和为:{count}</h1>
            <button onClick={() => setCount(count + 1)}>点我+1</button>
        </div>
    )
}
const Foo = memo(function Foo() {
    console.log('Foo被渲染了');
    return (
        <div>这是Foo组件</div>
    )
})
复制代码

useCallback是什么?

常用于性能优化,缓存函数,使得组件重新渲染时得到相同的函数实例。

useCallback的基本用法

在这里我们需要注意的是useCallback的第一个参数时我们需要缓存的函数,第二个参数是一个数组,数组中包含的是没有变化的目标函数。

function App() {
    const [count, setCount] = useState(0);
    const resetCount = useCallback(() => setCount(0),[setCount]);
    return (
        <div>
            <Foo resetCount={resetCount}/>
            <h1>当前求和为:{count}</h1>
            <button onClick={() => setCount(count + 1)}>点我+1</button>
        </div>
    )
}
const Foo = memo(function Foo(props) {
    console.log('Foo被渲染了');
    return (
        <div>
            这是Foo组件
            <button onClick={props.resetCount}>点我归零</button>
        </div>
    )
})
复制代码

参考资料

相关文章
|
负载均衡 应用服务中间件 API
微服务技术系列教程(25) - SpringCloud- 接口网关服务Zuul
微服务技术系列教程(25) - SpringCloud- 接口网关服务Zuul
443 0
|
Web App开发 JavaScript 前端开发
Electron V8排查问题之Chrome DevTools的Memory工具的使用如何解决
Electron V8排查问题之Chrome DevTools的Memory工具的使用如何解决
284 0
|
JavaScript Java 开发工具
Electron V8排查问题之接近堆内存限制的处理如何解决
Electron V8排查问题之接近堆内存限制的处理如何解决
791 1
Vue3头像(Avatar)
这是一个基于 Vue3 的头像组件库,提供了圆形和方形两种头像形状,并支持自定义大小、图片、图标及字符展示。
453 1
Vue3头像(Avatar)
|
前端开发 JavaScript
前端 JS 经典:图片裁剪上传原理
前端 JS 经典:图片裁剪上传原理
241 0
|
JSON 前端开发 数据格式
前端开发中的跨域问题及解决方案
【2月更文挑战第3天】 在前端开发中,跨域是一个常见的技术难题。本文将介绍跨域问题的产生原因,以及在前端开发中常见的跨域解决方案,包括JSONP、CORS、代理和设置响应头等方法,帮助开发者更好地理解和解决跨域相关的技术挑战。
553 2
|
Java
springboot Test 测试类中如何排除一个bean类
springboot Test 测试类中如何排除一个bean类
483 0
|
存储 缓存 JavaScript
跨标签页通信的8种方式(上)
跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中,每个标签页都是相互独立的,无法直接共享数据。然而,有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作,这就需要使用跨标签页通信来实现。
330 0
|
JavaScript 前端开发
|
机器学习/深度学习 存储 编解码
阿里云ARM计算架构云服务器最新收费标准与活动价格表参考
ARM计算架构阿里云服务器有计算型c8y、通用型g8y、内存型r8y、ARM 通用型g6r、ARM 计算型c6r等实例规格可选,不同实例规格的租用收费价格是不一样的,本文为大家汇总了目前基于ARM计算架构下的各个实例规格的阿里云服务器收费标准,以供参考。
阿里云ARM计算架构云服务器最新收费标准与活动价格表参考