useCallback使用注意

背景

useCallback的作用时基于依赖项缓存函数,但是这个缓存时取值缓存而不是按照地址缓存,这导致了如果缓存的函数使用的值依赖外部某个变量,这个变量只会取第一次用到的值

例子

具体可以看https://codesandbox.io/s/misty-night-vds9oo?file=/demo.js

import "@arco-design/web-react/dist/css/arco.css";
import { useState, useCallback } from "react";
import { useMemoizedFn } from "ahooks";

function Demo(props) {
  const getValue = useCallback(() => {
    return props.test;
  }, []);
  return <div>{getValue()}</div>;
}
function Demo2(props) {
  const getValue = () => {
    return props.test;
  };
  return <div>{getValue()}</div>;
}
function Demo3(props) {
  const getValue = useMemoizedFn(() => {
    return props.test;
  }, []);
  return <div>{getValue?.()}</div>;
}

function App() {
  const [test, setTest] = useState("1");
  return (
    <div>
      无缓存的
      <Demo2 test={test} />
      有缓存但有问题的
      <Demo test={test} />
      有缓存且符合预期
      <Demo3 test={test} />
      <button
        onClick={() => {
          setTest(Math.random());
        }}
      >
        点击更改test值
      </button>
    </div>
  );
}

export default App;

demo

解决办法

使用https://ahooks.js.org/zh-CN/hooks/use-memoized-fn/替代useCallback

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值