React Hooks ---useMemo

转载于:https://segmentfault.com/a/1190000018697490

把“创建”函数和依赖项数组作为参数传入 useMemo,它仅会在某个依赖项改变时才重新计算 memoized 值。这种优化有助于避免在每次渲染时都进行高开销的计算。

下面我们通过一个实例,来理解下 useMemo 的用法。

父组件

function App() {
  const [name, setName] = useState("名称");
  const [content, setContent] = useState("内容");
  return (
    <>
      <button onClick={() => setName(new Date().getTime())}>name</button>
      <button onClick={() => setContent(new Date().getTime())}>content</button>
      <Button name={name}>{content}</Button>
    </>
  );
}

子组件

function Button({ name, children }) {
  function changeName(name) {
    console.log("11");
    return name + "改变 name 的方法";
  }

  const otherName = changeName(name);
  return (
    <>
      <div>{otherName}</div>
      <div>{children}</div>
    </>
  );
}

熟悉 react 的同学可以很显然的看出,当我们点击父组件的按钮的时候,子组件的 name 和 children 都会发生变化。

注意我们打印 console.log 的方法。
不管我们是改变 name 或者 content 的值,我们发现 changeName 的方法都会被调用。
是不是意味着 我们本来只想修改 content 的值,但是由于 name 并没有发生变化,所以无需执行对应的 changeName 方法。但是发现他却执行了。 这是不是就意味着性能的损耗,做了无用功。

下面我们使用 useMemo 进行优化

优化之后的子组件

function Button({ name, children }) {
  function changeName(name) {
    console.log("11");
    return name + "改变 name 的方法";
  }

  const otherName = useMemo(() => changeName(name), [name]);
  return (
    <>
      <div>{otherName}</div>
      <div>{children}</div>
    </>
  );
}

export default Button;

这个时候我们点击 改变 content 值的按钮,发现 changeName 并没有被调用。
但是点击改变 name 值按钮的时候,changeName 被调用了。
所以我们可以使用 useMemo 方法 避免无用方法的调用,当然一般我们 changName 里面可能会使用 useState 来改变 state 的值,那是不是就避免了组件的二次渲染。
达到了优化性能的目的

posted @ 2021-02-18 16:08  小猪冒泡  阅读(141)  评论(0编辑  收藏  举报