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小白提供一个快速入门,让 ...
随机推荐
- HUST 1541 Student’s question
1541 - Student’s question 时间限制:1秒 内存限制:128兆 696 次提交 134 次通过 题目描述 YYis a student. He is tired of calc ...
- redis安装-单机版
环境准备 因为redis使用c语言开发的,如果要运行在linux上,需要gcc-c++的环境.那么我们就要先看一下是否安装了gcc-c++如果没有的话,需要在虚拟机上安装gcc-c++环境(友情提示, ...
- js-tab选项卡
说道tab选项卡,顾名思义,就是切换不同内容分类,想必学过前端的都知道,tab有很多方法可以实现,最近刚跟师傅学了一种,感觉很简便,很实用哦. 一.先看一下结果 二.可以根据图来布局,首先上面标 ...
- 中国大学MOOC中的后台文件传输
早期版本的中国大学MOOC一旦被挂起后,应用在完成当前下载任务后无法继续添加新任务,当然也无法将缓存状态写入数据库.这个问题能否顺利解决直接关系到用户体验. 顺便吐槽下,凡是使用了后台文件传输还提示你 ...
- JS批量替换内容中关键词为超链接,避开已存在的链接和alt、title中的关键词
懂点seo的人都知道要给内容中关键词加上链接,形成站内锚文本链接,这对seo有很大的帮助. 思路就是在数据库中录入若干个关键词和关键词对应的链接,当然链接可以根据关键词的id自动生成,或者直接用关键词 ...
- JS中都有哪些数据类型呢?
js中有5种数据类型:Undefined.Null.Boolean.Number和String.还有一种复杂的数据类型Object,Object本质是一组无序的名值对组成的.
- java 计算源码的行数
import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOExcepti ...
- loadrunner测试结果分析
LR性能测试结果样例分析 测试结果分析 LoadRunner性能测试结果分析是个复杂的过程,通常可以从结果摘要.并发数.平均事务响应时间.每秒点击数.业务成功率.系统资源.网页细分图.Web服务器资源 ...
- abp zero sample
测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin 密码:123456 需要源码,请加QQ:858-048-581 一.用户管理 二.日志记录 1.先编译成 ...
- Java虚拟机学习 - 垃圾收集器
HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. Serial(串行GC)收集器 Serial收集 ...