JSX
在前面 Hello World
的例子中,细心的你会发现,我们在 App.js
中对外暴露了一个函数,然而,在这个函数我们竟然返回了一个 h1
标签,那么,这样的表达到底是 HTML
还是 JS
呢?
答案两者都不是,这种语法称为 JSX
。
JSX
是一种用于描述 UI
的 JavaScript
扩展语法,通常,在 React
应用中使用这种语法来描述一个组件的 UI
。与其他框架一样,React
也是一个面向组件开发的框架,通过组件来将页面进行拆分并实现组件复用。React
认为,一个组件应该具备 UI
描述和数据。于是就有了 JSX
,作为 UI
描述和数据的桥梁。
更加直白的说,JSX
就是将 HTML
和 JS
进行了结合,可以在 HTML
中写 JS
代码,也可以在 JS
代码中写 HTML
。
在 JS
中使用 HTML
其实在前面 Hello World
的例子中都已经用过了,很简单,就是原样的使用。那么下面就来看看如何在 JS
中使用 HTML
.
示例:
import React from 'react';
import './App.css';
//声明一个变量
const name = 'jonas'
function App() {
return (
//在HTML标签体中,通过{JS表达式}来插入JS语法
<h1>Hello {name}</h1>
);
}
export default App;
需要注意的是,{}
中的内容只能是 JS
表达式,不能是语句!
上面例子中,在标签体内使用了 JS
表达式,然而,在标签的属性中,也可以通过同样的方式进行插入。
const name = 'jonas'
const style = 'my_class'
function App() {
return (
<h1 className={style}>Hello {name}</h1>
);
}
刷新发现标题有了一个类名,虽然没有定义这个类的样式,但是这个类名确实被加上了。
需要注意的是,在 JSX
语法中,因为 class
是 JS
的一个关键字,所以使用了 className
来表示一个标签的类名。
JSX
对象
JSX
这种语法无法被浏览器引擎直接识别的,它需要被转译为浏览器可以识别的 JS
。
然而这个转译的工作是由 Babel
完成的,它会把 JSX
转译为一个 React.createElement()
的函数调用。
示例:
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
转译:
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
然而,React.createElement()
实际上是创建了一个对象:
// 注意:这是简化过的结构
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};
这种对象被称为 React
元素,它们描述了希望在屏幕上看到的内容。React
通过读取这些对象,然后使用它们来构建 DOM
以及保持随时更新。