深入JSX

JSX In Depth

  • 实际上,JSX 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖

指定 React 元素类型

  • JSX 标签的第一部分指定了 React 元素的类型

  • 大写字母开头的 JSX 标签意味着它们是 React 组件

    • 这些标签会被编译为命名变量的直接引用

React 必须在作用域内

  • 由于 JSX 会编译为 React.createElement 调用形式,所以 React 库也必须包含在 JSX 代码作用域内

  • 在 JSX 中 React 即使没有被直接调用,也需要导入

  • 如果你不使用 JavaScript 打包工具而是直接通过 script 标签加载 React,则必须将 React 挂载到全局变量中

在 JSX 类型中使用点语法

  • 在 JSX 中,你可以使用点语法来引用一个 React 组件。

  • 当你在一个模块中导出许多 React 组件时,这会很方便

    ```jsx harmony

const MyComponents = { DatePicker: function DatePicker(props) { return Image a {props.color} datepicker here. } }

function BlueDatePicker() { return }

### 用户定义的组件必须以大写字母开头

* 以小写字母开头的元素代表一个 HTML 内置组件,比如 div span 会生成相应的字符串 'div' 'span' 传递给 React.createElement 作为参数
* 大写字母开头的元素相应着在 JavaScript 引入或自定义的组件 `<Foo />` 会编译为 React.createElement(Foo)

* 如果确实需要一个以小写字母开头的组件,则在 JSX 使用它之前,必须将它赋值给一个大写字母开头的变量

### 在运行时选择类型

* 不能将通用表达式作为 React 元素类型
* 如果你想通过通用表达式来 动态 决定元素类型,你首先要将它赋值给大写字母开头的变量
    * 这通常用于根据 prop 来渲染不同组件的情况下
```jsx harmony

import React from 'react';
import { PhotoStory, VideoStory } from './stories';

const components = {
  photo: PhotoStory,
  video: VideoStory
};

function Story(props) {
  // 错误!JSX 类型不能是一个表达式。
  return <components[props.storyType] story={props.story} />;

  // 正确!JSX 类型可以是大写字母开头的变量。
  const SpecificStory = components[props.storyType];
  return <SpecificStory story={props.story} />;
}

JSX 中的 Props

  • 有多种方式可以在 JSX 中指定 props

JavaScript 表达式作为 Props

<MyComponent foo={1 + 2 + 3 + 4} />

属性展开

// 以下两个组件是等价的 ```jsx harmony

function App1() { return ; }

function App2() { const props = {firstName: 'Ben', lastName: 'Hector'}; return ; }

```

最后更新于