reactjs - 为什么即使更改的 prop 或 state 与 JSX 无关,React 也会重新渲染组件?
问题描述
为什么 React 会在组件的 prop 或 state 发生更改时重新渲染组件,即使更改后的 prop 或 state 与返回的 JSX 无关?
我从官方文档中了解了React Reconciliation 。它解释了差异机制,但不是当状态对虚拟 DOM 树没有视觉影响时重新渲染组件的需要。
考虑下面给出的琐碎的虚拟代码,其中myState
是App
组件的状态,它与返回的 JSX 没有关系,但如果myState
被更新(发生在内部buttonClickHandler
,React 会重新渲染App
组件。
import React, { useState } from "react";
const App = () => {
console.log("[App] rendered");
const [myState, setMyState] = useState(false);
const buttonClickHandler = () => {
console.log("Button clicked!");
setMyState((prevState) => !prevState);
};
return <button onClick={buttonClickHandler}>Click Me</button>;
};
export default App;
解决方案
因为 React 不可能在返回之前知道状态或 prop 更改是否对 JSX 产生影响。
即使一个组件被重新渲染,也不意味着它被重新协调到真正的 DOM 中(事实上,如果没有更改,则 DOM 保持不变)。
如果函数组件的渲染计算量很大,您可以使用 eguseMemo
来记忆那些繁重的计算。
推荐阅读
- automated-tests - Cucumber / Serenity 在 HTML 报告的屏幕截图中不包括选择选项
- javascript - Javascript:使用变量解析 JSON
- javascript - 在线时 workbox-webpack-plugin 服务工作者不会从缓存中获取
- javascript - 需要帮助获取 JS 文件以使用 Laravel 5.7 和 Laravel Mix 查找 JQuery
- c# - 每次使用 MVVMLight WPF 导航到页面时如何调用函数
- dart - 未来在 dart 中执行一个命令
- git - 将存储库与文件历史记录合并
- ios - 无法推断通用参数“T” - 泛型问题
- python - 为什么我得到 core.Model.none?
- android - 如何修复 connectionManager.activeNetworkInfo 不能为空?使用科特林