React应用切换页面重载或父组件重载时,已保存的state是否会被清除?
React应用与组件重载下的State生命周期解答
本文提到的「重载」均指组件/应用的卸载后重新挂载流程,和普通的组件重新渲染(re-render,仅更新视图不销毁实例)不属于同一场景。
1. 无路由适配场景下页面切换触发应用重载是否清除所有已保存State
答案是会完全清除所有内存中的State:
你描述的未做路由适配的场景下,切换页面本质是触发了浏览器整页刷新,整个React应用的根实例会被完全销毁,所有存储在应用运行内存中的状态,包括组件内部useState/this.state定义的状态、Context全局状态、Redux/Mobx等状态管理库存在内存中的状态都会被同步清空。
只有你主动持久化到localStorage/sessionStorage/IndexedDB、或是存储在服务端的状态,才会在应用重新挂载后被读取恢复。
2. 父组件重载时子组件的State是否会被移除
答案是会被完全移除:
React的组件实例是严格依附于组件树的层级关系存在的,当父组件触发重载(即父组件先卸载、再重新挂载)时,React会先递归销毁父节点下的所有后代组件,子组件的实例会被完全回收,对应的内部State也会被同步销毁,类组件的componentWillUnmount、函数组件useEffect的清理函数都会依次执行。
父组件重新挂载完成后,所有子组件都会创建全新的实例,State会回归初始默认值,和销毁前的状态没有任何关联。
核心规则总结
- 浏览器级整页刷新会销毁整个React应用实例,所有内存存储的状态全部清空
- 任意组件的卸载+重新挂载流程,都会销毁其自身及所有后代组件的实例与对应State
- 若仅父组件重新render、子组件没有触发卸载(子组件
key属性无变更、没有被条件渲染判定为不渲染),子组件的State会正常保留
内容的提问来源于stack exchange,提问作者Avishek Barnwal
相关产品推荐
相关产品推荐

