从根本上来说,JSX语法提供了一种创建React元素的语法糖,JSX语句可以编译成: 
React.createElement(component, props, …children)的形式,比如:

<MyButton color="blue" shadowSize={2}>
Click Me
</MyButton>

编译结果:

React.createElement(
MyButton,
{color: 'blue', shadowSize: 2},
'Click Me'
)
当然,你也可以使用自闭和的形式:
<div className="sidebar" />

可以得到相同的编译结果。

1.指定React元素的类型

JSX标签的头部,决定了React元素的类型,大写的标签,意味着JSX的标签与React的组件一一对应,比如

<Foo/>标签就对应了Foo组件

(1)必须包裹在一定的范围内

import React from 'react';
import CustomButton from './CustomButton'; function WarningButton() {
// return React.createElement(CustomButton, {color: 'red'}, null);
return <CustomButton color="red" />;
}

比如这样,引入了2个组件,构成了一个新的组件WarningButton,组件的返回值的元素,必须包含在一定范围内,这里通过函数的’{ ‘, ’ } ‘实现包裹的效果。

(2)用户定义的组件必须大写

我们前面已经说过,JSX的标签与组件是一一对应的,当我们使用JSX语法,引用组件的时候,标签必须要大写(同时定义组件的函数名也必须是大写的)。

function Hello(){
return <h2>Hello,World</h2>
}
//定义过程
<Hello/>
//使用过程

(3)不能在运行期间,动态的选择类型 
我们不能在JSX中,动态的规定组件的类型,举例来说:

import React from 'react';
import { PhotoStory, VideoStory } from './stories'; const components = {
photo: PhotoStory,
video: VideoStory
}; function Story(props) {
return <components[props.storyType] story={props.story} />;
//这样写是不对的,我们在返回的组件中,动态定义了组件,这种动态的定义是无效的
}

应该改写为:

import React from 'react';
import { PhotoStory, VideoStory } from './stories'; const components = {
photo: PhotoStory,
video: VideoStory
}; function Story(props) { const SpecificStory = components[props.storyType];
return < SpecificStory story={props.story} />;
//这样就是正确的,我们不要在JSX的标签中使用动态定义
}

2.JSX中的Props属性

(1)JS表达式 
可以通过{},包裹js的语法来使用。比如:

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

等价于:

<MyComponent foo={10} />

如果不是js表达式,则不能包裹在{}中使用。

(2)Props属性的默认值 
Props上的属性可以有默认值,并且默认值为true,比如:

<MyTextBox autocomplete />

<MyTextBox autocomplete={true} />

上面这两个式子是等价的,但是不推荐使用默认值,因为在ES6的语法中{foo}代表的意思是:{foo:foo}的意思,并不是{foo:true}。

(3)扩展属性 
可以通过ES6的…方法,给组件赋属性值,例如:

function App1() {
return <Greeting firstName="Ben" lastName="Hector" />;
} function App2() {
const props = {firstName: 'Ben', lastName: 'Hector'};
return <Greeting {...props} />;
}

上面的这两种方式是等价的。

3.JSX中的children

(1)children中的function

我们来考虑自定义组件中包含函数的情况:

function ListOfTenThings() {
return (
<Repeat numTimes={10}>
{(index) => <div key={index}>This is item {index} in the list</div>}
</Repeat>
);
}

那么何时调用这个children中的方法呢?

function Repeat(props) {
let items = [];
for (let i = 0; i < props.numTimes; i++) {
items.push(props.children(i));
}
return <div>{items}</div>;
}

我们从上述的Repeat组件的定义中可以看出来,children中的方法按此定义会一直执行10次。

(2)忽略Boolean,Null以及Undefined

false,null,undefined以及true是不能通过render()方法,呈现在页面上的,下面的这些div块的样式 
相同,都是空白块:

<div />

<div></div>

<div>{false}</div>

<div>{null}</div>

<div>{true}</div>

这种属性,在通过render呈现元素的时候,是十分有用的,比如我们只想在div元素中展现Head组件, 
例子如下:

<div>
{showHeader && <Header />}
<Content />
</div>

这里的逻辑是,只有showHeader==true,在会在页面呈现Header组件,否则为null,即为不显示任何东西,这相当于一个if的判断了。

再举一个例子:

<div>
{props.messages.length &&
<MessageList messages={props.messages} />
}
</div>

在这个div中,我们需要知道的是即使元素为0,0是能够呈现在页面中的。也就是说上述代码中,只要 
props.messages数组存在,不管长度是否为0都是存在的。(这里不同于js,js中的语法认为0==false)

(3)如何显示Null,Undefined和Boolean

如果我们一定要再页面上显示Null等,可以将其先转化为字符串之后再显示。

<div>
My JavaScript variable is {String(myVariable)}.
</div>

通过String的转化后就能在页面上显示了。

React高级教程(es6)——(1)JSX语法深入理解的更多相关文章

  1. React中最基础的jsx语法

    import React, { Component } from 'react'; class App extends Component { render() { return ( <div ...

  2. [Web 前端] React高级教程(es6)——(2)对于Refs最新变动的理解

    cp : https://blog.csdn.net/liwusen/article/details/53384561 1.什么是ReactJS中的refs 在React中组件并不是真实的 DOM 节 ...

  3. react系列(一)JSX语法、组件概念、生命周期介绍

    JSX React中,推出了一种新的语法取名为JSX,它给了JS中写HTML标签的能力,不需要加引号.JSX的语法看起来是一种模板,然而它在编译以后,会转成JS语法,只是书写过程中的语法糖. JSX的 ...

  4. 【原创】React实例入门教程(1)基础API,JSX语法--hello world

    前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...

  5. react系列教程

    这个系列将从基础语法讲起,把react全家桶都讲到,然后到具体的使用,最后完成后,会写一个完整的demo. 前置要求: 基本的CSS,JS要熟练. 部分ES6语法需要了解.可以参考下面提到的阮一峰老师 ...

  6. Webstorm 不识别es6 import React from ‘react’——webstorm不支持jsx语法怎么办

    2016-10-31更新 webstorm不支持es6语法怎么办? webstorm不支持jsx语法怎么办? 参考:webstorm不支持jsx语法怎么办 I spent ages trying to ...

  7. React实例入门教程(1)基础API,JSX语法--hello world

      前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发 ...

  8. React JSX语法说明

    原文:http://my.oschina.net/leogao0816/blog/379487 什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代 ...

  9. 小白学习React官方文档看不懂怎么办?2.JSX语法

      接下来我们就要讲到JSX语法了,在我们讲它之前,我们先引入一个概念叫语法糖.     听到这个名字首先我们可能会想到一个词叫”糖衣炮弹“,那么什么叫糖衣炮弹呢,就是给你说各种好听的话,来迷惑你,但 ...

随机推荐

  1. Mac Eclipse安装lombok

    Lombok是一个可以通过注解的形式可以帮助消除一些必须但是显得很臃肿的Java代码的工具,通过使用对应的注解,可以在进行编译源码的时候生成对应的方法,比如类属性的get/set/toString() ...

  2. 禅道docker化(Centos7.2)

    操作步骤 确认服务器禅道版本及容器禅道版本 服务器禅道版本:9.6.2 容器禅道版本:9.6.3 版本sql比对 下载官方9.6.3源码包url:http://dl.cnezsoft.com/zent ...

  3. 怎么用js编写1——100的质数?

    这里来自csdn问答的一个问题,怎么用js编写1——100的质数? http://ask.csdn.net/questions/214429 质数也就是素数,即只能被1和自身整除的数,因此可以构造循环 ...

  4. Mysql命令行tab自动补全方法

    在mysql命令行有时为了方便想要按tbl键自动补全命令,以便节约时间. 具体方法如下: 第一步:修改my.cnf vi mysql/etc/my.cnf 将下图红框的代码注释,修改成如下代码: #d ...

  5. oracle客户端instantclient如何配置

    下载下来的instantclient-basic-nt-11.2.0.4.0.zip文件解压缩D:\Program Files\instantclient_11_2(可以选择自己的目录) (1) 增加 ...

  6. cs231n笔记 (一) 线性分类器

    Liner classifier 线性分类器用作图像分类主要有两部分组成:一个是假设函数, 它是原始图像数据到类别的映射.另一个是损失函数,该方法可转化为一个最优化问题,在最优化过程中,将通过更新假设 ...

  7. 合并两个git仓库并保留提交记录

    case如下: 有2个git仓库:repo1.repo2: 想将repo1中的文件移入repo2: repo1的历史日志要保留:   1 2 # 1.将repo1作为远程仓库,添加到repo2中,设置 ...

  8. C++常用的文件操作路径函数

    shlwapi.dll中的实用API函数发布 在windows   system目录下有这个动态链接库  BOOL PathFileExists(LPCTSTR lpszPath)功能:检查文件/路径 ...

  9. IDEA 快捷将创建main函数

    在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一个main方法就写好了. psvm 也就是public static void main的首字母. 依次还有在方法体内键入f ...

  10. CodeFirst简单演示的步骤

    CodeFirst简单演示的步骤 创建实体类[Student] public class Student { public long Id { get; set; } public string Na ...