React文档翻译系列(三)JSX简介
# React文档翻译系列(三)JSX简介
先来看一下下面的变量声明:
```
const element =
Hello world!
```
这种有趣的标签语法既不是字符串也不是HTML。
这种形式被称作JSX,他是Javascript的一种扩展语法。我们推荐在React中使用这种形式来描述UI该是什么样子的。JSX可能会让你想起某种模板语言,但是它具有Javascript的全部功能。
JSX会生产出React“元素”。我们将在[下一部分](https://facebook.github.io/react/docs/rendering-elements.html)来探索如何将它渲染到DOM上。接下来,您可以找到JSX的基础知识,以帮助您开始使用。
## **JSX中嵌入表达式**
您可以在JSX中,通过一对大括号嵌入任何的[Javascript表达式](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Expressions)。
比如`2+2`,`user.firstName`,和`formatName(user)`,这些都是可用的表达式。
```
function formatName(user) {
return user.firstName + ' ' + user.lastName;
}
const user = {
firstName: 'Harper',
lastName: 'Perez'
};
const element = (
Hello, {formatName(user)}!
);
ReactDOM.render(
element,
document.getElementById('root')
);
```
[在CodePen中尝试。](http://codepen.io/gaearon/pen/PGEjdG?editors=0010)
为便于阅读,我们将JSX分隔成多行。我们推荐使用括号将JSX包裹起来,尽管这不是必须的,因为这样可以避免[分号自动插入](http://stackoverflow.com/q/2846283)的陷阱。
## **JSX也是一种表达式**
编译之后,JSX表达式就变成了常规的Javascript对象。
这意味着你可以在`if`语句或者是`for`循环中使用JSX,用它给变量赋值,当做参数接收它,或者作为函数的返回值。
```
function getGreeting(user) {
if (user) {
return
Hello, {formatName(user)}!
;
}
return
Hello, Stranger.
;
}
```
## **用JSX指定属性**
您可以使用引号来指定字符串作为属性:
```
const element =
;
```
您也可以在一个属性中通过花括号嵌入一个Javascript表达式:
```
const element = ;
```
在属性中嵌入Javascript表达式的时候不要使用引号来包裹花括号。否则JSX会将属性当做一个字符串而不是表达式。在同一个属性中,您可以选择使用引号(字符串的值)或者是花括号(表达式),但是不能同时使用。
## **使用JSX指定子元素**
如果标签是空的,您应该像XML一样立即使用`/>`关闭它:
```
const element = ;
```
JSX标签可能包含子元素:
```
const element = (
Hello!
Good to see you here.
);
```
> **警告**
由于JSX相对HTML来说更接近于Javascript,所以React DOM使用驼峰方式为属性命名来取代HTML的属性名。
例如,在JSX中,`class`变成了[`className`](https://developer.mozilla.org/en-US/docs/Web/API/Element/className),`tabindex`变成了[`tabIndex`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/tabIndex)。
## JSX防止了注入式攻击
在JSX中,嵌入用户输入是安全的:
```
const title = response.potentiallyMaliciousInput;
// This is safe:
const element =
{title}
;
```
默认的,React DOM在渲染通过JSX嵌入的任何内容之前,都会将他们的值进行转义。这样就确保了除非在你的应用中明确的写出来的内容,绝对不会注入其他任何内容。
在被渲染之前,所有的东西都被转义成为了字符串,这样就能帮助您防止[XSS(cross-site-scripting)](https://en.wikipedia.org/wiki/Cross-site_scripting)攻击。
## JSX表示对象
Babel将JSX编译成`React.createElement()`调用。
下面的两个例子是相同的:
```
const element = (
Hello, world!
);
```
```
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
```
`React.createElement()`会执行一些检查来帮助你写出没有bug的代码,但是它创建对象的原理是像下面这样:
```
// Note: 这是简化的结构
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world'
}
};
```
这些对象被称作“React元素”。你可以把他们想象成为你想在屏幕上看到的东西的一种描述。React会读取这些对象,用他们来构建DOM,并且保持它们的不断更新。
我们将在下一部分来探索如何将React元素渲染到DOM上。
> **Tips**
我们建议您为选择的编辑器搜索“Babel”语法方案,以便ES6和JSX代码都能够被正确高亮的显示。
React文档翻译系列(三)JSX简介的更多相关文章
- React文档翻译系列(二)Hello World
这是React文档翻译系列的第二篇,前一篇介绍了如何安装react,本篇主要介绍react的知识体系,掌握了基本的知识体系,才能更好的学习React. Hello World 开始React最简单的方 ...
- React基础篇 - 02.JSX 简介
JSX 简介 请观察下面的变量声明: const element = <h1>Hello, world!</h1>; 这种看起来可能有些奇怪的标签语法既不是字符串也不是HTML ...
- React文档翻译系列(一)安装
原文地址:原文 本系列是针对React文档进行的翻译,因为自己在学习react的时候,最开始通过看博客或者论坛等中文资料,有些内容是零零散散的接收,并没有给自己带来很好的效果,所以后来决定把文档的原文 ...
- React Native 系列(三) -- 项目结构介绍
前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...
- React Native 系列(三)
前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...
- React学习笔记 - JSX简介
React Learn Note 2 React学习笔记(二) 标签(空格分隔): React JavaScript 一.JSX简介 像const element = <h1>Hello ...
- jsx简介
react文档笔记 jsx简介 jsx是一种javascript的语法扩展,jsx用来声明React当中的元素. 在jsx中使用表达式 jsx当中的表达式要包含在大括号里.例如2+2,user.fir ...
- React Native 系列(二) -- React入门知识
前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...
- React Native 系列(二)
前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...
随机推荐
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- C# 总结const、 readonly、 static三者区别:
总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...
- E. Change-free
Student Arseny likes to plan his life for n days ahead. He visits a canteen every day and he has alr ...
- JavaScript 基本类型值-Undefined、Null、Boolean
▓▓▓▓▓▓ 大致介绍 ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String. ▓▓▓▓▓▓ Undefined ...
- android学习10——对顶点着器和片段着色器的理解
图形都是点,线,面组成的.顶点着器指定了顶点的位置,大小和颜色. 看一个顶点着色器的代码 attribute vec4 a_Position; attribute float a_PointSize; ...
- java学习笔记——IO流部分
IO流常用的有:字符流.字节流.缓冲流.序列化.RandomAccessFile类等,以上列出的都是开发中比较常用的. 1.字节流: 字节流包含:FileInputStream/FileOutputS ...
- 每天一个linux命令(32)--/etc/group文件详解
Linux /etc/group 文件与 /etc/passwd 和/etc/shadow 文件都是有关于系统管理员对用户和用户组管理时相关的文件.Linux /etc/group 文件是有关于系统管 ...
- RHL 6.0学习日记, 先记下来,以后整理。
今天又遇到哪些问题呢? 1.配置网络的问题,我把网络配置文件胡乱改了,然后就上不了网了 因为一直都没怎么用到网络,网线都不怎么连接的,今天只是突然想ping一下,于是就Ping 了一下,一开始ping ...
- cura-engine学习(3)
目前,我们还在函数prepareModel中徘徊,因为这函数实在是太长了,近乎包含了整个数据处理过程.通过前面两篇,几何图形已经被导入到内存中,并且由一个simplemodel变成了一个optimiz ...
- Hibernate一对多双向关联映射
建立多对一的单向关联关系 Emp.java private Integer empNo //员工编号 private String empName / ...