30-React JSX IN DEPTH
JSX IN DEPTH
JSX
从根本上说,JSX只是提供了语法糖React.createElement(component, props, ...children)的功能。以下JSX代码:
<MyButton color="blue" shadowSize={2}> Click Me </MyButton>
被编译为:
React.createElement( MyButton, {color: 'blue', shadowSize: 2}, 'Click Me' )
您还可以使用标签的自闭形式,如果没有孩子,例如:
<div className="sidebar" />
编译为:
React.createElement(
'div',
{className: 'sidebar'},
null )
指定React元素类型
一个JSX标签的第一部分确定了React元素的类型。
大写类型表明JSX标签是一个React组件。这些标签会被编译成可以直接引用的命名变量,因此,如果您使用JSX 表达式,Foo必须是在范围内。
React必须在范围内
由于JSX编译时调用React.createElement,因此该React库必须始终在JSX代码范围内。例如:下面两个import都是必须的在代码里,尽管React 和CustomButton不直接从JavaScript中引用。
import React from 'react';
import CustomButton from './CustomButton';
function WarningButton() {
// return React.createElement(CustomButton, {color: 'red'}, null);
return <CustomButton color="red" />;
}
使用点符号的JSX类型
你可以使用点表示法引用内部的JSX组件。对于如果你有一个单一的模块需要导出很多React组件非常的方便。例如:
import React from 'react';
const MyComponents = {
DatePicker: function DatePicker(props) {
return <div>Imagine a {props.color} datepicker here.</div>;
} }
function BlueDatePicker() {
return <MyComponents.DatePicker color="blue" />; }
用户定义的组件必须大写
- 当一个元素类型以小写字母开头,它引用的是一个内置组件就像
或并且最终作为一个字符串'div'或'span'传递给React.createElement。
- 定义,或者从文件中导入到JavaScript的组件,一个大写字母开头的类型例如将会被编译成React.createElement(Foo)。
- 定义的组件应该以大写字母开头。如果您有以小写字母开头的组件,在JSX使用之前将其分配给一个大写的变量。否则将会报错
运行时类型选择
你不能使用一般的表达式作为React元素类型。。如果你想使用一般表达式来表示React元素的类型,只需要把它分配给一个首字母大写的变量。例如:
import React from 'react';
import { PhotoStory, VideoStory } from './stories';
const components = { photo: PhotoStory, video: VideoStory }; function Story(props) {
// Wrong! JSX type can't be an expression. 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) {
// Correct! JSX type can be a capitalized variable.
const SpecificStory = components[props.storyType];
return <SpecificStory story={props.story} />;
}
JSX中的属性
- JavaScript表达式
你可以通过任何JavaScript表达式作为属性,用{}包裹。例如:
<MyComponent foo={1 + 2 + 3 + 4} />
2.字符串字面量
你可以传递一个字符串作为属性。例如:
<MyComponent message="hello world" />
<MyComponent message={'hello world'} />
- Props 默认值为 "True"
如果你没有传递值给一个属性,它默认为true。以下两个JSX表达式 是相同的: (不建议使用)
<MyTextBox autocomplete />
<MyTextBox autocomplete={true} />
4.展开属性
如果你已经有了props一个对象,并希望将它传递给JSX,你可以用...一个“spread” 操作符来传递整个属性对象。以下两种组件时等效的:
function App1() {
return <Greeting firstName="Ben" lastName="Hector" />;
}
function App2() {
const props = {firstName: 'Ben', lastName: 'Hector'};
return <Greeting {...props} />;
}
Children in JSX
在同时包含一个开口标记和结束标记的JSX表达式,这些标签之间的内容传递作为一种特殊的属性:props.children。有几种不同的方式来传递的孩子:
1.字符串字面量 例如:
Hello world!
JSX会去掉的开头和结尾的空格,字符串中间的换行将会被压缩成一个空格。所以以下代码都是相同的:
<div>Hello World</div>
<div>
Hello World
</div>
<div>
Hello
World
</div>
- JSX Children:
你可以提供更多的JSX元素作为孩子,这对于嵌套组件来说很有用。例如:
<MyContainer>
<MyFirstComponent />
<MySecondComponent />
</MyContainer>
- JavaScript表达式:
你可以传递任何JavaScript表达式作为孩子,用大括号({}
)括起来。例如,这些表达式是等效的:
<MyComponent>foo</MyComponent> <MyComponent>{'foo'}</MyComponent>
- Functions as Children
传递到自定义组件的孩子可以是任何东西,只要该组件将它们转换为React渲染之前可以理解。这种用法是不常见的,但如果你想扩展JSX能力的话很有效。 - Booleans, Null, and Undefined 会被忽略
false,null,undefined,和true这类的儿童。React不会区域渲染。以下这些JSX表达式将全部呈现到同样的事情:
<div />
<div></div>
<div>{false}</div>
<div>{null}</div>
<div>{true}</div>
6.这些作为条件渲染会很有用,例如当showHeader是true的时候呈现一个
<div>
{showHeader && <Header />}
<Content />
</div>
如果你想有一个类似的值false,true,null,或undefined出现在输出中,你必须将它们转换成字符串。例如:
<div>
My JavaScript variable is {String(myVariable)}.
</div>
30-React JSX IN DEPTH的更多相关文章
- React JSX语法说明
原文:http://my.oschina.net/leogao0816/blog/379487 什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代 ...
- React(JSX语法)-----JSX基本语法
JSX------HTML tags vs React Components: 1.To render a html tag,just use lower-case tag names in JSX; ...
- 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品
http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...
- 在react jsx中,为什么使用箭头函数和bind容易出现问题
在之前的文章中,已经说明如何避免在react jsx中使用箭头函数和bind(https://medium.freecodecamp.o... 但是没有提供一个清晰的demo展示为什么要这样做. 现在 ...
- 在react jsx中使用if判断
在react jsx中如果使用if判断,需要这样做 var loginButton; if (loggedIn) { loginButton = <LogoutButton />; } e ...
- Airbnb React/JSX 编码规范
Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 内容目录 基本规范 Class vs React.createClass vs stateless 命名 声明 ...
- React useEffect in depth
React useEffect in depth useEffect class DogInfo extends React.Component { controller = null state = ...
- React Hooks in depth
React Hooks in depth React Hooks https://reactjs.org/docs/hooks-rules.html https://www.npmjs.com/pac ...
- 学习 React(jsx语法) + es2015 + babel + webpack
视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...
随机推荐
- anjularjs常用的内置方法
1.$apply anjularjs通过$apply方法去执行脏检查,及时告诉model绑定变量更新. 示例:定义一个date变量显示在页面上,它的控制器是firstCtrl,这个date变量有一个时 ...
- Android APP压力测试-Monkey
压力测试-Monkey学习 Monkey测试特点 什么是Monkey test? 如其名,像猴子一样,虽然什么都不懂,但是可以乱点一通,可以理解为压力测试.在规定的时间或次数范围内做任何随机的操作,随 ...
- 学霸数据处理项目之数据处理网页以及后台以及C#代码部分开发者手册
写在前面,本文将详细介绍学霸数据处理项目中的数据处理网页与后台函数,以及c#代码中每一个方法的意义及其一些在运行方面需要注意的细节,供开发人员使用,开发人员在阅读相关方法说明时请参照相关代码,对于本文 ...
- Big Data
Hadoop安装教程_伪分布式配置_CentOS6.4/Hadoop2.6.0 http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/ Spark ...
- Python开发【前端】:DOM
DOM(文档对象模型(Document Object Model)) 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页 ...
- Docker应用程序容器技术_转
转自:百度百科 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相 ...
- jNotify:操作结果信息提示条
我们在提交表单后,通过Ajax响应后台返回结果,并在前台显示返回信息,jNotify能非常优雅的显示操作结果信息.jNotify是一款基于jQuery的信息提示插件,它支持操作成功.操作失败和操作提醒 ...
- C++之路进阶——P2022
P2022 有趣的数 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的位置为Q( ...
- 夺命雷公狗-----React---14--移入移出事件
<!DOCTYPE> <html> <head> <meta charset="utf-8"> <title></ ...
- mysql 增删改查最基本用法小结
目录: 1.新建数据库 2.新建数据表 3.查看表结构 4.增删改查 建立一个数据库students 建立一块数据表class1 内容包括: id 主键 自动编号 无符号位 SMALLINT类型 na ...