React hooks之 useCallback的使用

官网:

关于useCallback:

需要明白的是:

1:使用Function组件时会定义很多内部函数,总觉得会影响组件性能,其实不然:看这里:

由于在渲染中创建函数,Hooks 很慢吗? 不会。在现代浏览器中,闭包的原始性能与类相比没有显着差异,除非在极端情况下。

2:Hooks设计使得它更有效

钩子避免了类所需的大量开销,例如在构造函数中创建类实例和绑定事件处理程序的成本。 使用 Hooks 的惯用代码不需要在使用高阶组件、渲染道具和上下文的代码库中普遍存在的深层组件树嵌套。使用更小的组件树,React 要做的工作更少。

3:React.memo 和 React.useCallback 一定记得需要配对使用,缺了一个都可能导致性能不升反“降”

useCallback:

const memoizedCallback = useCallback(fn, deps) fn :一个函数最终会返回该回调函数,该回调函数仅仅只在 deps 参数发生改变时才会更新 deps :数组;用于触发 fn 回调函数改变的参数列表。

例子

import React, { useState } from react;
import { Space, Button } from antd;
export default function Index() {
  const [count, setcount] = useState(0);

  const ShowTime = () => {
    console.log(now time : + new Date());
  };

  return (
    <>
      <h1>index:{count}</h1>
      <Space>
        <Button type="primary" onClick={() => setcount(count + 1)}>
          increase
        </Button>
        <ChildComponent fn={ShowTime} />
      </Space>
    </>
  );
}
const ChildComponent = (props) => {
  console.log(child render!);
  return (
    <Button type="primary" onClick={props.fn}>
      showTime
    </Button>
  );
};

这里其实是有问题的,count并没有传递给子组件,但是count得值变化了,子组件也更新了,这不是我们想要的

用useCallback,memo改进

import React, { useState, memo, useCallback } from react;
import { Space, Button } from antd;
export default function Index() {
  const [count, setcount] = useState(0);

  /**
   * 把原来的showTime函数放在useCallback中
   */
  const countCallback = useCallback(() => {
    console.log(now time : + new Date());
  }, []);

  return (
    <>
      <h1>index:{count}</h1>
      <Space>
        <Button type="primary" onClick={() => setcount(count + 1)}>
          increase
        </Button>
        <ChildComponent fn={countCallback} />
      </Space>
    </>
  );
}
const ChildComponent = memo((props) => {
  console.log(child render!);
  return (
    <Button type="primary" onClick={props.fn}>
      showTime
    </Button>
  );
});

当我们更新count的时候,子组件并没有重新渲染

useCallback的第二个参数deps中阔以添加依赖,只有当这些依赖变化时视图才会重新更新

经验分享 程序员 微信小程序 职场和发展