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

为何在React render方法前后使用document.getElementById()不生效?

问题原因分析

你遇到的问题核心在于React对根节点的控制权管理以及React 18的异步渲染特性,具体拆解如下:

1. React完全接管根节点的DOM控制权

当你通过ReactDOM.createRoot(document.getElementById("root"))创建React根实例后,React会完全掌控该节点的所有内容。任何直接通过原生DOM API(比如innerHTML)修改这个节点的操作,要么会被React后续的渲染流程覆盖,要么会破坏React内部的DOM状态追踪,导致不可预期的显示结果。

2. React 18的异步渲染机制

React 18开始,root.render()是异步执行的。这意味着:

  • 如果你把document.getElementById("root").innerHTML = "Hey Buddy!"放在root.render()之后,你的原生DOM修改会先执行,把内容改成"Hey Buddy!",但随后React的异步渲染任务完成,会清空根节点并渲染你定义的<h1>Heading</h1>,最终覆盖你的修改。
  • 如果你把这段代码放在createRoot之前,虽然会先把根节点内容改成"Hey Buddy!",但root.render()执行时会立即清空根节点,渲染React元素,最终页面会显示"Heading"而非默认值。

3. 脚本执行错误导致代码终止

如果页面始终显示初始的"heyyy boi",大概率是你的脚本执行过程中出现了错误(比如React或ReactDOM未成功加载,导致React/ReactDOM变量未定义),使得后续的DOM修改和React渲染代码都没有执行,页面停留在了静态HTML的初始状态。你可以打开浏览器控制台(F12)查看是否有相关报错。

正确的做法

如果你想修改页面内容,应该遵循React的开发范式,通过React的渲染逻辑来实现,而非直接操作原生DOM。比如修改React.createElement的文本内容:

const heading = React.createElement(
    "h1",
    {},
    "Hey Buddy!" // 直接修改这里的文本
);
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(heading);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:33:11