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

React中如何将ThemeContext传递给createRoot渲染的组件?

解决createRoot渲染组件丢失上下文的问题

你用createRoot创建的是一个独立的React根实例,它和App组件所在的根上下文树完全隔离,所以Test组件无法访问到上层的ThemeContext。下面提供两种可行的解决方法:

方法一:在新根中手动复用上下文值

既然Container组件本身处于ThemeContext.Provider的覆盖范围内,可以先在Container里获取上下文值,然后在createRoot渲染时,给Test组件重新包裹一层ThemeContext.Provider,把拿到的上下文值传递进去:

import { useContext, useEffect } from 'react';
import { createRoot } from 'react-dom/client';

const Test = () => {
  const context = useContext(ThemeContext);
  console.log(context); // 现在能正常获取上下文
  return <div />;
};

const Container = () => {
  // 先在Container中获取上层传递的ThemeContext值
  const themeContextValue = useContext(ThemeContext);

  useEffect(() => {
    const placeholder = document.querySelector('#placeholder');
    const root = createRoot(placeholder);
    
    root.render(
      // 重新包裹Provider,复用上层的上下文值
      <ThemeContext.Provider value={themeContextValue}>
        <Test />
      </ThemeContext.Provider>
    );

    // 清理函数:组件卸载时销毁独立根
    return () => root.unmount();
  }, [themeContextValue]); // 上下文更新时重新渲染

  return null;
};

const App = () => {
  return (
    <ThemeContext.Provider value={{ mode: 'dark', primaryColor: '#2c3e50' }}>
      <Container />
    </ThemeContext.Provider>
  );
};

方法二:尽量避免使用独立根(推荐)

如果业务场景允许,尽量不要创建独立的React根,而是用React原生方式管理组件渲染。比如把目标容器作为ref,直接在Container的JSX中渲染Test:

import { useRef } from 'react';

const Container = () => {
  const placeholderRef = useRef(null);

  return (
    <div ref={placeholderRef}>
      {/* 直接渲染Test,自动继承上层上下文 */}
      <Test />
    </div>
  );
};

这种方式下Test会自动继承上层的ThemeContext,不需要额外处理,是更符合React设计理念的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:28:14