React学习-JSX

45 阅读2分钟

JSX(JavaScript XML)是 React 中用于描述 UI 的一种 语法扩展。它看起来很像 HTML,但实际上会被编译成普通的 JavaScript 函数调用(通常是 React.createElement()),从而构建 React 元素(React Elements)。下面从多个角度详细解释 JSX,并与 Vue 的模板语法进行对比。

注意精准的描述✅:JSX 是 JavaScript 的语法扩展

而不是❌:JSX是一种模版语法

JSX 是 JavaScript 的语法扩展,允许你在 JavaScript 代码中直接编写类似 HTML 的结构。它不是字符串,也不是 HTML,而是一种更直观地创建 React 元素的方式。

我们写的jsx代码:

const element = <h1>Hello, world!</h1>;

编译后等价于:

const element = React.createElement('h1', null, 'Hello, world!');

现在的编译工具不止有 Babel

  • React Compiler (Forget) :React 团队推出的实验性编译器,旨在通过静态分析自动优化 useMemouseCallback 等,目前可作为 Babel 插件 或集成到 Vite、Next.js 中使用。
  • SWC (Speedy Web Compiler) :目前最流行的 Babel 替代品,由 Rust 编写。它的单线程编译速度比 Babel 快 20 倍,已被 Next.js 等主流框架选为默认编译器。
  • esbuild:基于 Go 语言开发,以极速著称。它集成了转译和打包功能,是 Vite 在开发环境下的核心驱动引擎。
  • tsc (TypeScript Compiler) :如果你使用 TypeScript,tsc 本身就具备将 JSX 转译为 JS 的能力,无需 Babel 配合。

JSX本质上是 React.createElement() 函数调用的语法糖

JSX 返回的是什么?

JSX 表达式最终返回的是是一个普通 JavaScript 对象,我们管这个对象叫:React 元素(React Element) ,例如:

const el = <div className="box">Content</div>;

输出大致如下(简化版):

{
  type: "div",
  props: {
    className: "box",
    children: "Content"
  }
}

它是一个描述Dom结构的蓝图,最终构建成一个 虚拟DOM,然后通过 DIFF 算法,计算出最小变更,最后去更新真实的DOM。

JSX 的核心特点

表达式嵌入:使用 {} 嵌入任意 JavaScript 表达式。

const name = "Alice";
const element = <h1>Hello, {name}!</h1>;

这也是jsx 与传统模版语法最大的区别, 传统模版语法都有一套自己的语法规则,你必须去学习它定义的规则,增加学习成本;

而JSX 通过一个{},让你可以在大括号内使用任意有效 javascript表达式,所以你不用去学习任何新的模版写法、指令,直接使用javascript原生能力;

  • 变量与表达式
  • 函数调用
  • 条件判断
  • 列表渲染等

所以说 jsx 是 JavaScript 的语法扩展

总结:

  • JSX 是 JavaScript 的语法扩展:提供了更具可读性的声明式写法
  • 返回的是一个js对象:它是虚拟DOM的基础
  • {}写法,融合了js语法的全部能力:无需额外学习特定的模版语法