DevToolBox免费
博客广告合作

HTML 转 JSX:React 迁移所需的一切

10 分钟阅读作者 DevToolBox

将 HTML 模板迁移到 React 意味着将标记重写为 JSX。虽然 JSX 看起来类似 HTML,但有关键差异,如果忽略这些差异会导致编译错误。本指南涵盖了你需要做的所有更改。

使用我们的免费工具自动将 HTML 转换为 JSX →

为什么 JSX 与 HTML 不同

JSX 不是 HTML。它是 JavaScript 的语法扩展,编译为 React.createElement() 调用。因为 JSX 存在于 JavaScript 中,它遵循 JavaScript 规则——一些 HTML 属性名与 JavaScript 保留字冲突。

如果在 JSX 中使用标准的 HTML 属性如 classfor,编译器会抛出错误。理解这些差异对于任何 React 迁移都至关重要。

关键属性差异

以下是从 HTML 转换为 JSX 时最常见的需要更改的属性:

HTMLJSX原因
classclassNameclass 是 JS 保留字
forhtmlForfor 是 JS 保留字
tabindextabIndexJSX 使用 camelCase
readonlyreadOnlyJSX 使用 camelCase
maxlengthmaxLengthJSX 使用 camelCase
onclickonClickJSX 使用 camelCase
style="color: red"style={{'{'}color: "red"{'}'}JSX 的 style 是对象

Style 属性

在 HTML 中,style 是字符串。在 JSX 中,它是一个 JavaScript 对象,属性名使用 camelCase:

<!-- HTML -->
<div style="background-color: #f0f0f0; font-size: 14px; margin-top: 20px;">
  Hello
</div>

// JSX
<div style={{ backgroundColor: "#f0f0f0", fontSize: "14px", marginTop: "20px" }}>
  Hello
</div>

所有 CSS 属性名必须使用 camelCase:background-color 变为 backgroundColorfont-size 变为 fontSizez-index 变为 zIndex

自闭合标签

HTML 允许某些标签不闭合(空元素)。在 JSX 中,每个标签都必须显式关闭

  • <br><br />
  • <hr><hr />
  • <img src="..."><img src="..." />
  • <input type="text"><input type="text" />
  • <meta charset="utf-8"><meta charSet="utf-8" />
<!-- HTML -->
<img src="photo.jpg" alt="Photo">
<input type="email" placeholder="Email">
<br>

// JSX
<img src="photo.jpg" alt="Photo" />
<input type="email" placeholder="Email" />
<br />

事件处理器

HTML 使用小写事件属性作为字符串。JSX 使用 camelCase 并传入函数引用:

<!-- HTML -->
<button onclick="handleClick()">Click me</button>
<input onchange="handleChange()" onfocus="handleFocus()">

// JSX
<button onClick={handleClick}>Click me</button>
<input onChange={handleChange} onFocus={handleFocus} />

在 JSX 中,事件处理器接收的是 SyntheticEvent,而不是原生 DOM 事件。React 会跨浏览器规范化事件以保持一致行为。

JSX 中的注释

HTML 注释(<!-- ... -->)在 JSX 中无效。需要使用 JavaScript 块注释包裹在花括号中:

<!-- HTML comment -->
<div>Hello</div>

// JSX comment
<div>
  {/* This is a JSX comment */}
  Hello
</div>

常见陷阱

  • 忘记 className——最常见的迁移错误。搜索替换所有 class=className=
  • 内联样式使用字符串——style="margin: 10px" 会抛出错误;需要使用对象
  • 未闭合标签——没有自闭合斜杠的 <img><br> 会报错
  • 相邻元素——JSX 必须返回单个根元素;用 <>...</>(Fragment)包裹兄弟元素
  • 布尔属性——HTML 的 disabled 在 JSX 中相同,或显式写为 disabled={true}
  • 文本中的花括号——字面量 {} 必须使用 {'{'}{'}'} 表示
// Fragment wrapper for multiple elements
function App() {
  return (
    <>
      <Header />
      <Main />
      <Footer />
    </>
  );
}

自动化迁移

手动将大型 HTML 文件转换为 JSX 容易出错。我们的 HTML to JSX 转换器自动处理所有转换——class 到 className、style 字符串到对象、自闭合标签等。

立即试用 HTML to JSX 转换器 →

这篇文章有帮助吗?

保持更新

获取每周开发技巧和新工具通知。

无垃圾邮件,随时退订。

合作推荐

赞助这篇文章

把你的产品放到这个开发者主题旁边,并追踪点击效果。

咨询文章赞助

本站使用 Cookie 进行流量分析与广告展示。继续浏览即视为同意。 隐私政策