如何使用备忘录优化 React Hooks 中的代码

How to optimize code in React Hooks using memo

我有这个code

这是代码片段

  const [indicators, setIndicators] = useState([]);
  const [curText, setCurText] = useState('');
  const refIndicator = useRef()

  useEffect(() => {
    console.log(indicators)
  }, [indicators]);

  const onSubmit = (e) => {
    e.preventDefault();
    setIndicators([...indicators, curText]);
    setCurText('')
  }

  const onChange = (e) => {
    setCurText(e.target.value);
  }


  const MemoInput = memo((props)=>{
    console.log(props)
    return(
      <ShowIndicator name={props.name}/>
    )
  },(prev, next) => console.log('prev',prev, next)
  );

每次我在表格中添加时它都会显示每个指标。

问题是 ShowIndicator 每次我添加内容时都会更新。

有没有办法限制我的应用程序呈现的时间,因为例如我创建了 3 ShowIndicators,然后它也会呈现 3 次,我认为这在很长一段时间内非常昂贵 运行.

我也在考虑使用 useRef 只是为了不让我的应用程序在每次输入新文本时都呈现,但我不确定它是否是正确的实现,因为大多数文档建议通过使用状态作为处理程序来使用受控组件当前值。

React.memo 如果父组件重新渲染(并且道具相同),将停止您的子组件渲染,但这对您的情况没有帮助,因为您已经在 App 组件中定义了该组件。每次 App 呈现时,您都在创建 MemoInput 的新引用。

更新示例:https://codesandbox.io/s/currying-tdd-mikck

Link 到沙盒:

https://codesandbox.io/s/musing-kapitsa-n8gtj

App.js

  // const MemoInput = memo(
  //   props => {
  //     console.log(props);
  //     return <ShowIndicator name={props.name} />;
  //   },
  //   (prev, next) => console.log("prev", prev, next)
  // );

  const renderList = () => {
    return indicators.map((data,index) => {
      return <ShowIndicator key={index} name={data} />;
    });
  };

ShowIndicator.js

import React from "react";

const ShowIndicator = ({ name }) => {
  console.log("rendering showIndicator");
  const renderDatas = () => {
    return <div key={name}>{name}</div>;
  };

  return <>{renderDatas()}</>;
};

export default React.memo(ShowIndicator);    // EXPORT React.memo

观察给定的沙盒应用程序行为,似乎整个应用程序 在有 n 个指标时呈现 n 次

我分叉了沙箱并将列表移动到另一个功能组件(并且 memo 基于 prevnext 属性对其进行了编辑。

This will ensure my 'List' is rendered every time a new indicator is added. The whole app will render only when a new indicator is added to the list.

检查这个从你的沙箱中分叉出来的沙箱 - https://codesandbox.io/embed/avoid-re-renders-react-l4rm2