23.useCallback使用(React)

介绍

useCallback 是 React 中的一个 Hook,用于记住一个函数的引用,这样当组件重新渲染时,如果依赖项没有变化,就不会创建新的函数实例。这样可以避免不必要的重新渲染

// 使用 useCallback 来记住这个函数

  const newFunction = useCallback(function(){} , []);

// 依赖项为空数组,表示里面的函数不会因组件渲染而改变

 与useMemo类似

  • useCallback 接受两个参数:要记住的函数依赖数组

使用场景(例)

memo 中props含函数

下面的代码涉及到父组件 App 和子组件 MemoSon 的渲染过程。

import { memo, useState } from "react";

// 子组件
const MemoSon = memo(function Son(props) {
  console.log(`我是子组件,我渲染了`);
  return <div>我是子组件</div>;
});

// 父组件
function App() {
  const [count, setCount] = useState(0);

  function fn(){}
  
  console.log("父组件渲染");

  return (
    <div className="App">
      <MemoSon fn={fn} />
      <button onClick={() => setCount(count + 1)}>点击渲染父组件</button>
    </div>
  );
}

export default App;
  • 当点击 "点击渲染父组件" 按钮时,父组件会重新渲染输出 "父组件渲染"。
  • 然而,由于memo组件传递的props里的 fn 函数每次都会被重新定义,导致 MemoSon 的 props(即 fn)发生变化。这会导致 MemoSon 也会重新渲染

运行结果

用 useCallback 解决

这时就可以用 useCallback 记住这个函数的引用,并传空的依赖数组,使函数不会因组件渲染而重新定义,这样子组件也不会随着父组件一起渲染。

// 父组件
function App() {
  const [count, setCount] = useState(0);

  const newFn = useCallback(function fn(){},[])

  console.log("父组件渲染");

  return (
    <div className="App">
      <MemoSon fn={newFn} />
      <button onClick={() => setCount(count + 1)}>点击渲染父组件</button>
    </div>
  );
}

运行结果

 

完整代码

import { memo, useCallback, useState } from "react";

// 子组件
const MemoSon = memo(function Son(props) {
  console.log(`我是子组件,我渲染了`);
  return <div>我是子组件</div>;
});

// 父组件
function App() {
  const [count, setCount] = useState(0);

  const newFn = useCallback(function fn(){},[])

  console.log("父组件渲染");

  return (
    <div className="App">
      <MemoSon fn={newFn} />
      <button onClick={() => setCount(count + 1)}>点击渲染父组件</button>
    </div>
  );
}

export default App;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值