javascript - 如何防止重新渲染未更改的组件?

标签 javascript reactjs react-native react-hooks

我有一个由其他几个组件(例如文本字段)组成的组件,当对文本字段进行输入时,所有其他组件都会重新呈现。我想防止重新渲染,只重新渲染实际更改的组件。我已经看到“useCallback”是执行此操作的正确方法,并且我已经看到了如何使用它。但是,我在让“useCallBack”在我的情况下正常工作时遇到了一些麻烦。即使我以如下简单的方式设置它,输入文本字段的每个新字符都会导致按钮再次呈现。我没有看到我的错误。
See working example in sandbox.

const Button = () => {
  console.log("Button Rendered!");
  window.alert("Button Rendered");
  return <button onClick="">Press me</button>;
};

export default function App() {
  const [textInput, setTextInput] = useState("Hallo");

  const onChangeInput = useCallback(
    (e) => {
      setTextInput(e.target.value);
    },
    [textInput]
  );

  return (
    <div>
      <input
        type="text"
        onChange={onChangeInput}
        value={textInput}
      />
      <Button />
    </div>
  );
}
我很高兴任何 calrification。

最佳答案

我个人会避免React.memo/React.useRef/React.useCallback .
您的示例最简单的解决方案是创建另一个组件,并用它存储状态。
例如。

const Button = () => {
  console.log("Button Rendered!");
  window.alert("Button Rendered");
  return <button onClick="">Press me</button>;
};

const TextInput = () => {
  const [textInput, setTextInput] = useState("Hallo");
  const onChangeInput = useCallback(
    (e) => {
      setTextInput(e.target.value);
    },
    [textInput]
  );
  return (
      <input
        type="text"
        onChange={onChangeInput}
        value={textInput}
      />
  );
}


export default function App() {
  return (
    <div>
      <TextInput/>
      <Button />
    </div>
  );
}
在上面如果你改变Text,App中没有State改变,所以Button不会被重新渲染,不需要useMemo等。
你会发现 React 工作得非常好,你将组件划分得越多,它不仅解决了重新渲染的问题,而且可能使以后重用组件变得更容易。
IOW:让状态尽可能靠近组件,性能随之而来。
当然,您的示例很简单,在真正的应用程序中,您将需要处理 HOC 等,但这是另一个问题.. :)

关于javascript - 如何防止重新渲染未更改的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66590082/

相关文章:

reactjs - 如何让爬虫知道在 Gatsby React 中重定向页面

javascript - RxJS 中的同步性

javascript - 获取第一个单词和换行符之间的内容

javascript - 刷新 react 组件

react-native - 如何删除 React Native Text 组件下不需要的填充?

node.js - react native 命令没有响应

android-widget - 是否可以使用Ionic Framework或React Native为Android创建主屏幕小部件?

javascript - 无法通过 Node.js 将 Heroku 配置变量传递到 Angular CLI 应用程序

javascript - 在 db 中插入对象数组,仅获取控制台中的最后一个对象数据

javascript - 如何运行 Deck.gl 入门示例