javascript - 如何防止由于调用钩子useSelector()而导致的重新渲染?
问题描述
EDIT
它是由<React.StrictMode></React.StrictMode>
in引起的index.js
。我不知道为什么,但这很奇怪。
我注意到钩子useSelector()
导致应用程序不必要地重新渲染。这是预期的吗?如果是,我应该放弃使用redux-toolkit-js
吗?
我没有在 React Native 上测试过这种行为,但我认为在 React Native 中重新渲染会成为一个问题。
HookuseSelector
导致应用程序重新渲染 2 次并且它复合,这意味着如果应用程序Redux
由于状态更新而仅重新渲染 2 次,那么简单地调用useSelector()
将导致应用程序重新渲染 4 次。
这是我重现问题所采取的步骤:
- npx create-react-app my-app --template redux
- cd 我的应用程序
- npm 开始
- 添加 console.log
App.js
和features/counter/Counter.js
let i = 0;
function App() {
i++
console.log("App()", i)
...
}
- 检查浏览器 DevTools 的控制台。
解决方案
React 在严格模式下在开发环境中进行额外渲染,以帮助您发现错误并为您做一些检查。它不会在生产版本中执行此操作。
来自严格模式的文档:
严格模式不能自动为您检测副作用,但它可以通过使它们更具确定性来帮助您发现它们。这是通过有意双重调用以下函数来完成的:
- 类组件
constructor
,render
和shouldComponentUpdate
方法- 类组件静态
getDerivedStateFromProps
方法- 功能组件体
- 状态更新函数( 的第一个参数
setState
)- 传递给
useState
、useMemo
或的函数useReducer
推荐阅读
- html - 如何更改此 CSS 以减少下拉效果的错误?
- android - 如果 Fragment 中没有 @Inject 构造函数,则无法提供 LinearLayoutManager
- node.js - 为什么容器在执行 docker run 命令后立即退出?
- c - 用 Malloc 连接两个字符串
- python - 为什么我的 RawKernel 减速器会导致 cudaErrorIllegalAddress?
- java - Graphics2D 在保存文件前旋转
- javascript - 在 NPM 安装中使用 SubDivisionModifier 三 - 缺少示例
- javascript - 将每个捕获的字符替换为 *?
- jquery - 在 Bootstrap 中启动 Modals 时如何在文本框上进行 .focus()
- curl - 更新 html 会话 R