ReactNote02:了解JSX语法

欲要学好React,JSX语法须先行

JSX 简介

先来看这样的一段代码:

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

是不是感觉有点怪怪的,因为它既不是字符串,也不是HTML,它就是 JSX,是一个 JavaScript 的语法扩展。React官方建议在 React 中配合使用 JSX,因为JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。

在JSX中插入javascript的方式

在 JSX 语法中,你可以在大括号内放置任何有效的 JavaScript 表达式。(什么是表达式?)

const name = 'james kobe';
const element = <h1>Hello, {name}</h1>;

ReactDOM.render(
  element,
  document.getElementById('root')
);

为了便于阅读,我们可以将JSX语法拆分成多行,并将内容包裹在小括号中,这样可以避免陷入自动插入分号的陷阱。

const element = (
  <div>
    <h1>Hello!</h1>
    <h2>Good to see you here.</h2>
  </div>
);

JSX也是一个表达式

在编译之后,JSX 表达式会被转为普通 JavaScript 函数调用,并且对其取值后得到 JavaScript 对象。

也就是说,你可以在 if 语句和 for 循环的代码块中使用 JSX,将 JSX 赋值给变量,把 JSX 当作参数传入,以及从函数中返回 JSX:

function getGreeting(user) {
  if (user) {
    return <h1>Hello, {formatName(user)}!</h1>;
  }
  return <h1>Hello, Stranger.</h1>;
}

JSX的特定属性

你可以通过使用引号,来将属性值指定为字符串字面量:

const element = <div tabIndex="0"></div>;

也可以使用大括号,来在属性值中插入一个 JavaScript 表达式:

const element = <img src={user.avatarUrl}></img>;

在属性中嵌入 JavaScript 表达式时,不要在大括号外面加上引号。你应该仅使用引号(对于字符串值)或大括号(对于表达式)中的一个,对于同一属性不能同时使用这两种符号。

需要注意的是:

  • 因为 JSX 语法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 camelCase(小驼峰命名)来定义属性的名称,而不使用 HTML 属性名称的命名约定。

  • 例如,JSX 里的 class 变成了 className,而 tabindex 则变为 tabIndex

  • JSX的顶层只能有一个根元素,所以我们很多时候会在外层包裹一个div原生(或者使用后面我们学习的Fragment);

  • JSX中的标签可以是单标签,也可以是双标签。注意:如果是单标签,必须以/>结尾;

使用 JSX 指定子元素

假如一个标签里面没有内容,也就是说这个标签是一个单标签的话,你可以使用 /> 来闭合标签,就像 XML 语法一样:

const element = <img src={user.avatarUrl} />;

JSX 标签里能够包含很多子元素:

const element = (
  <div>
    <h1>Hello!</h1>
    <h2>Good to see you here.</h2>
  </div>
);

JSX 表示对象

Babel 会把 JSX 转译成一个名为 React.createElement() 函数调用。

以下两种示例代码完全等效:

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);

const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

疑问:(什么是表达式?表达式和语句又有什么区别呢?)

语句指的是执行单元,通常以行为单位,表达式指的是可用于计算的式子,即可能产生一个值的式子。语句可以包含有表达式,表达式也可以单独形成一个语句。

表达式会产生一个值,如赋值表达式:a=1。在控制台输出1。

表达式可以参与运算,如:

var c = 1==2 ? 3 : 4;

1==2 是一个表达式,1==2 ? 3 : 4这也是一个表达式,表达式是由运算符构成并运算产生结果的语法结构。

我们通常用”;”来分隔语句,组成程序,而本身就是语句的语法结构如:

if(){}else{} for(){} 等。

表达式一般由操作符和操作数组成,而我们把表达式按照语法结构组成语句,然后组成程序,表达式跟语句有重合的部分。

因此可以理解为表达式通常是语句的一部分或者本身就能起到一个语句的作用,而语句代表一段可执行的程序的最小单元。

------------- 本文结束 感谢阅读 -------------