React优化组件渲染(re-render)到哪个地步就算可以了?

作者站长头像
站长
· 阅读数 13

问题

用React函数式调用组件,感觉组件re-render次数过多。CodeSandBox

不会打印出"Very slow component re-mounts" 算可以了?还是说"Very slow component re-renders"也不要打印

回复
1个回答
avatar
test
2024-07-20

首先VerySlowComponent不能放在Component里面,因为它是个函数(引用类型的东西),放在里面,每次state变化,它都要重新赋值一遍,也就每次VerySlowComponent都在变化,有变化就会重新渲染执行;另外,VerySlowComponent渲染不依赖state变化,为了不必要的渲染,需要用memo包起来,它会判断自己依赖的数据有没有发生变化,没变化就不会重新渲染了;

import { useState, useEffect, memo} from "react";
import "./styles.css";
const VerySlowComponent = memo(() => {
  console.log("Very slow component re-renders");
  useEffect(() => {
    console.log("Very slow component re-mounts");
  }, []);
  return <div>Very slow component</div>;
});

const Component = () => {
  const [state, setState] = useState(1);

  const onClick = () => {
    setState(state + 1);
  };

  return (
    <>
      <button onClick={onClick}>click here</button>
      <VerySlowComponent />
    </>
  );
};

const App = () => {
  return (
    <>
      <h2>Open console, click a button</h2>
      <p>Slow component will re-mount on every click</p>

      <Component />
    </>
  );
};

export default App;
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容