JSX:JavaScript和HTML的完美联姻

63 阅读3分钟

什么是JSX?

想象一下,你是一位厨师,需要同时处理食材(JavaScript)和摆盘(HTML)。如果每次都要在两个厨房之间跑来跑去,是不是很麻烦?JSX就像是一个一体化厨房,让你可以在同一个地方完成所有工作!

用官方的话说,JSX是JavaScript的语法扩展(JS in XML),允许你在JavaScript代码中直接嵌入HTML结构。它就像是HTML和JavaScript的混血儿,既拥有HTML的直观,又具备JavaScript的强大

JSX长什么样?

看看这个例子,是不是有种似曾相识的感觉?

const element = <h1 className='title'>Hello, world</h1>

这就是JSX!它看起来就像是HTML,但实际上是JavaScript的语法糖。

JSX背后的秘密

你可能会问:"浏览器能直接理解JSX吗?"

答案是:不能!就像你不能直接吃生肉一样,JSX需要经过"烹饪"才能被浏览器消化。这个烹饪过程就是编译,通常由Babel来完成

const element = <h1 className='title'>Hello, world</h1>

编译后(普通JavaScript):

const element2 = createElement('h1', {className: 'title', id: 'title'}, 'Hello world')

看到了吗?JSX其实是 React.createElement() 函数的语法糖。它让我们写起来更像在写HTML,而不是复杂的JavaScript函数调用

JSX的超能力

1. 动态内容注入

JSX允许你像变魔术一样把JavaScript变量插入到HTML中:

<ul>
  {todos.map((todo) => (
    <li key={todo.id}>{todo.title}</li>
  ))}
</ul>

这里的 {todo.title} 就是把JavaScript变量嵌入到HTML中的魔法咒语

2. 组件化思想

JSX让React组件的定义变得异常简单直观。一个函数,返回一些JSX,就构成了一个组件:

function App() {
  return (
    <>
      <ul>...</ul>
      {element}
      {element2}
    </>
  )
}

JSX的小脾气

虽然JSX看起来很像HTML,但它有自己的一些小脾气:

  1. className而非class :因为class是JavaScript的关键字,所以在JSX中我们用className来定义CSS类
  2. htmlFor而非for :同理,for也是关键字,所以用htmlFor代替
  3. 自闭合标签 :所有标签都必须闭合,比如 而不是
  4. 只能有一个根元素 :如果你有多个元素,需要用一个父元素包裹,或者使用Fragment( <> )

为什么要用JSX?

  1. 直观易读 :相比嵌套的createElement调用,JSX更接近我们熟悉的HTML,让UI结构一目了然
  2. 减少错误 :JSX在编译时会进行语法检查,帮助我们提前发现错误
  3. 提高效率 :编写JSX比编写纯JavaScript函数调用要快得多
  4. React的核心特性 :JSX是React的一大优点特性,让React组件的定义更加简洁优雅

总结

JSX就像是一位优秀的翻译官,它让我们可以用更自然、更直观的方式与React对话。虽然它看起来像HTML,但骨子里却是JavaScript。通过Babel的帮助,它能完美地融入JavaScript的世界,为我们构建精彩的UI界面提供强大支持。

下次当你看到JSX代码时,不妨想想它背后的 createElement 调用,感受一下这个语法糖带来的甜蜜!