React 之 useCallback(缓存函数)(十八)

useCallback 是一个允许你在多次渲染中缓存函数的 React Hook。
useCallback 是一个 Hook,所以应该在 组件的顶层 或自定义 Hook 中调用。你不应在循环或者条件语句中调用它。如果你需要这样做,请新建一个组件,并将 state 移入其中。

//fn:想要缓存的函数。此函数可以接受任何参数并且返回任何值。
//dependencies:有关是否更新 fn 的所有响应式值的一个列表。响应式值包括 props、state,和所有在你组件内部直接声明的变量和函数。
//返回值:在初次渲染时,useCallback 返回你已经传入的 fn 函数在之后的渲染中, 
//如果依赖没有改变,useCallback 返回上一次渲染中缓存的 fn 函数;否则返回这一次渲染传入的 fn。
const cachedFn = useCallback(fn, dependencies)

跳过组件的重新渲染

默认情况下,当一个组件重新渲染时, React 将递归渲染它的所有子组件。
为了缓存组件中多次渲染的函数,你需要将其定义在 useCallback Hook 中。

import { useCallback } from 'react';

function ProductPage({ productId, referrer, theme }) {
//为了缓存组件中多次渲染的函数,你需要将其定义在 useCallback Hook 中
  const handleSubmit = useCallback((orderDetails) => {
    post('/product/' + productId + '/buy', {
      referrer,
      orderDetails,
    });
  }, [productId, referrer]);
  // ...

防止频繁触发 Effect

function ChatRoom({ roomId }) {
  const [message, setMessage] = useState('');

  useEffect(() => {
    function createOptions() { // ✅ 无需使用回调或函数依赖!
      return {
        serverUrl: 'https://localhost:1234',
        roomId: roomId
      };
    }

    const options = createOptions();
    const connection = createConnection();
    connection.connect();
    return () => connection.disconnect();
  }, [roomId]); // ✅ 仅当 roomId 更改时更改
  // ...

优化自定义 Hook

如果你正在编写一个 自定义 Hook,建议将它返回的任何函数包裹在 useCallback 中。

function useRouter() {
  const { dispatch } = useContext(RouterStateContext);
  //这确保了 Hook 的使用者在需要时能够优化自己的代码
  const navigate = useCallback((url) => {
    dispatch({ type: 'navigate', url });
  }, [dispatch]);

  const goBack = useCallback(() => {
    dispatch({ type: 'back' });
  }, [dispatch]);

  return {
    navigate,
    goBack,
  };
}

相关推荐

  1. React useCallback缓存函数)(

    2024-05-13 00:20:05       9 阅读
  2. react hooks学习useMemo和useCallback

    2024-05-13 00:20:05       46 阅读
  3. React useCallback 详解

    2024-05-13 00:20:05       34 阅读
  4. ----react实战

    2024-05-13 00:20:05       40 阅读
  5. ReactuseCallback 使用的说明

    2024-05-13 00:20:05       45 阅读
  6. react的hooks的useCallback

    2024-05-13 00:20:05       37 阅读
  7. React@16.x(27)useCallBack

    2024-05-13 00:20:05       9 阅读
  8. React 记忆化函数cache(四)

    2024-05-13 00:20:05       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 00:20:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 00:20:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 00:20:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 00:20:05       20 阅读

热门阅读

  1. 最小生成树刷题笔记

    2024-05-13 00:20:05       9 阅读
  2. 为什么Redis6.0引入了多线程

    2024-05-13 00:20:05       13 阅读
  3. Hive优化(4)——数据倾斜优化

    2024-05-13 00:20:05       15 阅读
  4. (CDA数据分析师笔记)第六章 业务分析方法六

    2024-05-13 00:20:05       10 阅读
  5. GitFlow流程

    2024-05-13 00:20:05       9 阅读
  6. 数据结构之----栈与队列

    2024-05-13 00:20:05       11 阅读
  7. 链表所有节点和

    2024-05-13 00:20:05       8 阅读
  8. kotlin中协程相关

    2024-05-13 00:20:05       13 阅读
  9. Codeforces Round 944 (Div. 4)

    2024-05-13 00:20:05       10 阅读