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

2023-12-08

我有一个由多个其他组件(例如文本字段)组成的组件,当向文本字段进行输入时,所有其他组件都会重新呈现。

我想阻止重新渲染,只重新渲染实际更改的组件。

我已经看到了useCallback是执行此操作的正确方法,我已经了解了如何使用它。但是,我遇到了一些麻烦useCallBack为我的情况正确工作。

即使我按照如下简单方式进行设置,输入文本字段的每个新字符都会导致按钮再次呈现。

我没有看到我的错误。

请参阅沙箱中的工作示例。

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>
  );
}

我很高兴得到任何澄清。


我个人会避免React.memo / React.useRef / React.useCallback.

对于您的示例,最简单的解决方案就是创建另一个组件,并用它存储状态。

eg.

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 等,但这是另一个问题..:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止未更改的组件重新渲染? 的相关文章

随机推荐

  • 在 JNI 中返回多维数组

    我想将一个已经存在的多维数组从 C 返回到 Java 代码 我的代码如下 int cells 3 3 0 int Java com packagename appname GameView addNew JNIEnv env jobject
  • 三.js概述

    是否可以使用 Three js 在我的 3D 模型上显示黑色轮廓 我想要看起来像 无主之地 2 的图形 卡通阴影 黑色轮廓 我确信我来晚了 希望这能解决稍后某人的问题 这是交易 您不需要渲染一切两次 开销实际上并不大 您所需要做的就是复制网
  • PHP DOMDocument 没有 DTD、head 和 body 标签?

    是否可以使用 DOMDocument 类但不允许它添加 doc 类型声明 head 和 body 标记 我正在为服务器端包含编写当前的代码 并且它正在呈现在已经格式良好的页面上 我不需要额外的标签 Wrikken 所说的或者 对于 PHP
  • 使用 2 个日期参数之间(含)之间的日期填充临时表的最简单方法

    使用包含两个日期参数和两个日期参数之间的日期填充临时表的最简单方法是什么 我只需要该月日期的第一天 例如 如果 StartDate 2011 01 01 和 EndDate 2011 08 01 然后我希望将其返回到表中 2011 01 0
  • 在 UITableViewCell 和 UITableViewController 之间传递数据?

    我在 xcode 4 6 中创建了主详细信息模板项目 并添加了带有 2 个文本字段的自定义单元格 我还创建了新类 它是 UITableViewCell 的子类 在这个类中我创建了文本字段的出口 当用户键入某些内容时 NSMutableArr
  • 丢弃限定符错误

    对于我的 compsci 类 我正在实现一个 Stack 模板类 但遇到了一个奇怪的错误 Stack h 在成员函数 const T Stack
  • MySQL SELECT 唯一列,其中其他列是最大的

    我有这样的桌子 id serial num version 1 1 1 2 2 1 3 2 2 4 3 1 5 4 1 6
  • 有没有办法“逃避”ElasticSearch 停用词?

    我对 ElasticSearch 相当陌生 有一个关于停用词的问题 我有一个索引 其中包含美国的州名 例如 纽约 纽约 加利福尼亚 加利福尼亚 俄勒冈 俄勒冈 我相信俄勒冈州的缩写 OR 是一个停用词 因此当我将州数据插入索引时 我无法搜索
  • Python - 使用列表创建字典

    我在列表中有以下字符串 并且能够使用该列表作为字典中的键并分配默认值 来创建字典 当我打印时 我看到字典是按照列表中字符串的相反顺序创建的 为什么会发生这种情况以及如何纠正它 是否需要反向语法 a hello bye tc iam crea
  • 由于 CORS 问题,无法从 Azure APIM 后面的网页调用 API

    我正在使用 Azure APIM 我的 API 托管在由 net core 编码的 Azure 应用服务上 我已经在 APIM 后面配置了我的 api 然而 当我尝试调用我的 API 时 我遇到了这个问题 访问从原点 获取 http 本地主
  • PHP,来自字符串的虚拟文件,无需写入硬盘

    如果我有一个字符串 包含pdf文件 可以制作一个 虚拟 文件以避免在硬盘上写入 以便稍后在需要现有文件的函数上使用 theorical code file stringToVirtualFile string require file Yo
  • 如何在 QLineEdit 中使用 std::string ?

    我有以下问题 我正在尝试将我编写的大量代码与 Qt 界面集成 我的一些函数返回std string 我没有成功制作QLineEdit setText接受它们 其他函数返回char不要给我带来问题 我应该怎么办 谢谢 朱塞佩 尝试这个 std
  • 未捕获的语法错误:JSON 中位置 0 处出现意外标记 u

    仅在结帐和单个产品页面上 我在控制台日志中收到以下错误 VM35594 1 Uncaught SyntaxError Unexpected token u in JSON at position 0 at JSON parse
  • 如何删除推送通知API

    Apple 在提交 iOS 应用程序时发送以下电子邮件 缺少推送通知权利 您的应用程序似乎包含用于注册 Apple 推送通知服务的 API 但应用程序签名的权利不包括 aps environment 权利 如果您的应用程序使用 Apple
  • 将简单注射器与 Umbraco 控制器结合使用

    我试图将依赖项注入到继承自 Umbraco 的 RenderMvcController 的控制器中并收到错误 找不到 RenderMvcController 类型的注册 并且无法进行隐式注册 为了让容器能够创建 RenderMvcContr
  • nums[:] = nums[::-1] 和 nums = nums[::-1] 之间的区别[重复]

    这个问题在这里已经有答案了 我目前正在学习 Python 并且遇到了分配列表的问题 In def nextPermutation self nums List int gt None 我有一行代码可以反转列表 如下所示 nums nums
  • 二维数组动态内存分配崩溃[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中正确设置 访问和释放多维数组 我正在尝试使用 calloc 为 2D 数组动态分配内存 列固定为 2 因此只有行是动态的 这是我一直在尝试的 unsigned int pts rows
  • 每个关键字的前 'n' 个结果

    我有一个查询 要获取对特定关键字发表评论的前 n 个用户 SELECT user COUNT AS magnitude FROM results WHERE keyword economy GROUP BY user ORDER BY ma
  • 为什么在 main() 内声明 extern 变量可以工作,但在 main() 内定义它却不起作用?

    这看起来很微不足道 但对以下行为的严格解释将有助于我的理解extern很多 所以我会很感激你的回答 在下面的示例程序中 我声明了一个extern多变的x在函数内部 main 现在 如果我在文件范围内定义变量main 并分配8到它 那么程序就
  • 如何防止未更改的组件重新渲染?

    我有一个由多个其他组件 例如文本字段 组成的组件 当向文本字段进行输入时 所有其他组件都会重新呈现 我想阻止重新渲染 只重新渲染实际更改的组件 我已经看到了useCallback是执行此操作的正确方法 我已经了解了如何使用它 但是 我遇到了