为什么 React 应用程序在移动设备上冻结?
Why a React app freezes on mobile devices?
我使用 React 制作了一个小应用程序,它在我的电脑上运行流畅。但是,当我在不同的移动设备上打开它时,它会在使用一分钟左右后崩溃。我不知道是什么导致了这个问题,但奇怪的是,我的控制台上没有任何错误或警告,也没有使用 componentDidUpdate 或可能导致无限循环的挂钩,如 useEffect。如果您知道是什么原因导致 React 应用程序在移动设备上出现故障,或者遇到了同样的问题并找到了解决方案,请帮助我。
这是应用
https://summerresort.netlify.app
和代码
https://github.com/Mahmoud-farargy/summerresort/tree/master/Beach-Resort
谢谢!
除了 2 分,您的应用看起来一切正常。我无法验证我的猜测,但我几乎完全确定你的问题来自那两个。
看起来有问题的两个部分都位于index.js
,这里有:
window.addEventListener("scroll", () => {// gets the current height
let scroll = document.body.scrollTop || document.documentElement.scrollTop;
let arrowUp = document.querySelector(".arrow-up-btn").style;
scroll >= 1000 ? arrowUp.display="flex" : arrowUp.display = "none";
});
window.addEventListener("resize", ()=> {// gets the current width
this.setState({
currentPageWidth: window.innerWidth || document.documentElement.clientWidth
})
});
第一个代码块很昂贵,因为:
- The scroll event 被解雇 非常 频繁。
- 你不需要 listen for scroll passively(不过这是个好主意)。
- 您设置
style
的频率比需要的高很多。
但是,我认为是第二个代码块导致手机出现故障。
查看 this answer to see why the resize event 在手机上比在桌面上更频繁地触发。
- 现在,每次触发resize事件时,
MainApp
的状态
已更新。
- 每次
MainApp
更新时,React 都会重新计算其所有子项。
- 默认情况下,React 仅 re-run 渲染每个子项并比较输出。
考虑到您在 MainApp
中拥有所有路由和所有组件并且您没有实施任何优化(React.PureComponent
、路由延迟加载等)React 将不得不重新计算整个网站在每个 resize
事件中看起来都像。
最简单的解决方法是将 currentPageWidth
存储在 a ref 而不是状态中。
另一个可能的问题是,通过在 render 方法中附加监听器,您在 每个单独的渲染器上附加了新的监听器,而没有清除任何先前添加的监听器。
我使用 React 制作了一个小应用程序,它在我的电脑上运行流畅。但是,当我在不同的移动设备上打开它时,它会在使用一分钟左右后崩溃。我不知道是什么导致了这个问题,但奇怪的是,我的控制台上没有任何错误或警告,也没有使用 componentDidUpdate 或可能导致无限循环的挂钩,如 useEffect。如果您知道是什么原因导致 React 应用程序在移动设备上出现故障,或者遇到了同样的问题并找到了解决方案,请帮助我。 这是应用
https://summerresort.netlify.app
和代码
https://github.com/Mahmoud-farargy/summerresort/tree/master/Beach-Resort
谢谢!
除了 2 分,您的应用看起来一切正常。我无法验证我的猜测,但我几乎完全确定你的问题来自那两个。
看起来有问题的两个部分都位于index.js
,这里有:
window.addEventListener("scroll", () => {// gets the current height
let scroll = document.body.scrollTop || document.documentElement.scrollTop;
let arrowUp = document.querySelector(".arrow-up-btn").style;
scroll >= 1000 ? arrowUp.display="flex" : arrowUp.display = "none";
});
window.addEventListener("resize", ()=> {// gets the current width
this.setState({
currentPageWidth: window.innerWidth || document.documentElement.clientWidth
})
});
第一个代码块很昂贵,因为:
- The scroll event 被解雇 非常 频繁。
- 你不需要 listen for scroll passively(不过这是个好主意)。
- 您设置
style
的频率比需要的高很多。
但是,我认为是第二个代码块导致手机出现故障。
查看 this answer to see why the resize event 在手机上比在桌面上更频繁地触发。
- 现在,每次触发resize事件时,
MainApp
的状态 已更新。 - 每次
MainApp
更新时,React 都会重新计算其所有子项。 - 默认情况下,React 仅 re-run 渲染每个子项并比较输出。
考虑到您在 MainApp
中拥有所有路由和所有组件并且您没有实施任何优化(React.PureComponent
、路由延迟加载等)React 将不得不重新计算整个网站在每个 resize
事件中看起来都像。
最简单的解决方法是将 currentPageWidth
存储在 a ref 而不是状态中。
另一个可能的问题是,通过在 render 方法中附加监听器,您在 每个单独的渲染器上附加了新的监听器,而没有清除任何先前添加的监听器。