react中的useCallback 有什么作用?

在 React 中,useCallback 是一个优化性能的 Hook,主要用于 记忆化 (memoization)函数,从而防止在每次渲染时创建新的函数实例。具体来说,useCallback 可以帮助你确保某个函数只会在依赖项发生变化时才会重新创建,否则它会返回上一次的函数引用。

  • 适用场景 :函数作为 props 传递给子组件,或者作为 useEffect 依赖项时,可以使用 useCallback 优化性能。

  • 当函数比较简单或不传递给子组件时 ,没有必要使用 useCallback。React 会自动优化简单的函数,不需要显式缓

  • 举例一:传递函数给子组件: 当你将一个函数作为 prop 传递给子组件时,如果该函数在每次父组件渲染时都会重新创建,子组件也会重新渲染(如果该函数作为依赖项)。通过 useCallback,你可以确保只有在相关依赖变化时才会创建新的函数。

  • import React, { useState, useCallback } from 'react';

    function Child({ onClick }) {

    console.log("Child rendered");

    return <button onClick={onClick}>Click me</button>;

    }

    function Parent() {

    const [count, setCount] = useState(0);

    // 使用 useCallback 确保只有当 count 改变时,onClick 才会更新

    const handleClick = useCallback(() => {

    setCount(count + 1);

    }, [count]); // 依赖于 count

    return (

    <div>

    <Child onClick={handleClick} />

    <p>Count: {count}</p>

    </div>

    );

    }

    export default Parent;
    举例2 :与 useEffect 结合使用: useEffect 会在依赖项发生变化时重新运行,如果传给 useEffect 的回调函数总是被重新创建,可能会导致不必要的副作用执行。使用 useCallback 可以确保回调函数只有在必要时才被重新创建。

    import React, { useState, useEffect, useCallback } from 'react';

    function Example() {

    const [count, setCount] = useState(0);

    const memoizedCallback = useCallback(() => {

    console.log('Callback called');

    }, []); // 只有在依赖数组为空时,回调函数才会创建一次

    useEffect(() => {

    console.log('Effect ran');

    memoizedCallback();

    }, [memoizedCallback]); // 使用 memoizedCallback 作为 effect 的依赖

    return (

    <div>

    <p>Count: {count}</p>

    <button onClick={() => setCount(count + 1)}>Increment</button>

    </div>

    );

    }

相关推荐
2301_768350235 小时前
Vue第二期:组件及组件化和组件的生命周期
前端·javascript·vue.js
华洛7 小时前
公开一个AI产品的商业逻辑与设计方案——AI带来的涂色卡自由
前端·后端·产品
明远湖之鱼7 小时前
opentype.js 使用与文字渲染
前端·svg·字体
90后的晨仔7 小时前
Vue 3 组合式函数(Composables)全面解析:从原理到实战
前端·vue.js
今天头发还在吗7 小时前
【React】TimePicker进阶:解决开始时间可大于结束时间的业务场景与禁止自动排版
javascript·react.js·ant design
今天头发还在吗7 小时前
【React】动态SVG连接线实现:图片与按钮的可视化映射
前端·javascript·react.js·typescript·前端框架
小刘不知道叫啥7 小时前
React 源码揭秘 | suspense 和 unwind流程
前端·javascript·react.js
szial7 小时前
为什么 React 推荐 “不可变更新”:深入理解 React 的核心设计理念
前端·react.js·前端框架
mapbar_front8 小时前
面试是一门学问
前端·面试
90后的晨仔8 小时前
Vue 3 中 Provide / Inject 在异步时不起作用原因分析(二)?
前端·vue.js