如何防止React组件重渲染 保持导航菜单展开状态
问题根因与解决方案
你遇到的mounted状态被重置的问题,通常为以下两种情况,可对应排查修复:
- 情况1:导航栏组件在dispatch触发视图切换后被卸载重挂载
mounted是你声明在组件内部的useState状态,只要组件被卸载再重新渲染,就会自动回到初始值false。
排查方式:在导航栏组件中加入以下日志代码,点击导航后看控制台是否打印组件卸载的日志:
修复方案:useEffect(() => { console.log('导航栏组件挂载') return () => console.log('导航栏组件卸载') }, [])- 调整组件结构,将导航栏放在视图切换容器的外层,切换视图时导航栏不会被卸载,内部状态自然保留
- 如果无法调整结构,将
mounted状态提升到父组件,或者存入你当前正在使用的全局状态仓库中,脱离组件内部的生命周期限制
- 情况2:组件未卸载,有其他逻辑主动触发了
setMounted(false)
最常见的场景是点击导航项的事件冒泡触发了菜单外层的关闭逻辑,或者你在监听视图/路由变化的副作用中写了关闭菜单的代码。
排查方式:在所有调用setMounted的位置加日志,确认触发时机是否和dispatch同步。
修复方案:- 事件冒泡导致的问题,修改导航点击函数,阻止事件冒泡即可:
调用该函数时记得把点击事件对象传入const OnClickNav = (e: React.MouseEvent, index: string, dispatch) => { e.stopPropagation() const runValidations = null; dispatch(FormLayoutActions.updateCurrentView({ newView: index, runValidations })); };
2. 如果是视图变化的副作用中主动关闭了菜单,删除对应的关闭逻辑或者添加判断条件,点击导航时不触发关闭即可
内容的提问来源于stack exchange,提问作者lompa
相关产品推荐
相关产品推荐

