redux-persist PersistGate传入Loading组件时触发DOMException错误的解决方法
当给PersistGate的loading属性传入自定义<Loading />组件时出现Uncaught DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.错误,可按以下步骤排查修复:
检查Loading组件的DOM操作逻辑:确保组件内没有通过原生JS(如
document.getElementById、parentNode.removeChild等)直接操作PersistGate的容器节点,PersistGate内部会自行管理loading组件的挂载与卸载,外部私自修改DOM会破坏节点层级关系。避免使用Portal或脱离当前树的渲染:如果Loading组件中用到了
React.createPortal,或者第三方UI库的组件(如全局弹窗、toast)会将元素挂载到body等外部容器,这些元素不在PersistGate的DOM子树中,卸载时PersistGate会找不到对应节点触发错误。需移除这类逻辑,确保Loading的所有元素都在自身组件的DOM范围内。简化Loading组件测试:先替换成极简的loading组件(如
<div>加载中...</div>),如果问题消失,再逐步排查自定义Loading组件中的代码,比如是否有在useEffect中执行了未正确清理的DOM操作,或是嵌套了存在DOM操作的子组件。检查redux-persist版本兼容性:如果使用的redux-persist版本较老,可能与当前React版本存在兼容性问题。尝试升级到稳定版本(如v6.x系列),或降级到与项目React版本匹配的版本。
确保Loading组件是纯声明式渲染:用React的状态和props控制组件渲染,避免混合原生DOM操作,保持组件的React生命周期一致性。
内容的提问来源于stack exchange,提问作者Anisha Pal Mohor

