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>

    );

    }

相关推荐
寅时码4 小时前
React 之死·终章:一个 useRef,把闭包陷阱、依赖数组、漫天 rerender 全送走
前端·react.js·ai编程
不好听6134 小时前
HTML 事件监听机制:从 DOM Level 0 到 React 合成事件
前端·react.js·html
wordbaby4 小时前
为什么刷新页面就 404?聊聊 SPA 路由与 Nginx 的那点事
前端
不好听6134 小时前
React 核心概念:JSX、组件与数据驱动
前端·react.js
触底反弹4 小时前
🔥 React 零基础入门(中):500 行屎山代码到组件化的蜕变
前端·javascript·react.js
不好听6134 小时前
React vs Vue:两大前端框架技术选型深度对比
前端·vue.js·react.js
GuWenyue4 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
GuWenyue4 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
小林ixn5 小时前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn6 小时前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端