You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态挂载卸载Modal时出现Cannot update an unmounted root错误求助

问题原因

你遇到的Uncaught Error: Cannot update an unmounted root.错误,核心原因是全局的root实例被unmount()后就彻底失效了,无法再复用它执行render操作:

  • 第一次点击关闭modal时,root.unmount()会销毁这个root实例及其关联的DOM节点;
  • 再次点击打开modal时,调用root.render(Modal)会尝试更新一个已经被卸载的root实例,因此触发报错。
修复方案

方案一:保留root实例,渲染空内容替代卸载

这种方式更轻量,不需要销毁root,只是在关闭modal时渲染空内容:

const root = createRoot(document.getElementById('modals')!);

const Modal = <h1>Lorem ipsum dolor sit amet consectetur.</h1>;

export default function useModal() {
    const [up, setUp] = useState(false);

    useEffect(() => {
        // 打开时渲染Modal,关闭时渲染null
        root.render(up ? Modal : null);
    }, [up]);

    return [up, setUp] as const;
}

方案二:每次挂载时重新创建root实例

如果需要彻底清理modal的DOM和root实例,可以在打开时创建新root,关闭时销毁:

const Modal = <h1>Lorem ipsum dolor sit amet consectetur.</h1>;

export default function useModal() {
    const [up, setUp] = useState(false);
    const rootRef = useRef<Root | null>(null);

    useEffect(() => {
        const modalContainer = document.getElementById('modals')!;
        
        if (up) {
            // 打开时创建新的root实例并渲染Modal
            rootRef.current = createRoot(modalContainer);
            rootRef.current.render(Modal);
        } else {
            // 关闭时卸载root并清空引用
            if (rootRef.current) {
                rootRef.current.unmount();
                rootRef.current = null;
            }
        }

        // 组件卸载时的清理逻辑
        return () => {
            if (rootRef.current) {
                rootRef.current.unmount();
                rootRef.current = null;
            }
        };
    }, [up]);

    return [up, setUp] as const;
}

内容的提问来源于stack exchange,提问作者mod7ex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:15:43