设为首页
加入收藏
首页
C语言
C++
面试
Linux
函数
Windows
数据库
下载
搜索
我要投稿
全站搜索
文章
图片
软件
视频
商品
FLASH
产品
高级搜索
当前位置:
首页
->
基础
->
c++编程基础
TOP
(React: Up and Running)阅读笔记 ― JSX
2015-11-21 00:55:15
来源:
作者: 【
大
中
小
】 浏览:
1
次
Tags:
React:
and
Running
阅读
笔记
JSX
Transpiling JSX
transpilation是获取source code, 然后使用老版本浏览器可以理解的java script来重写的过程,这两个版本之间的语法不一样,但是功能是一样的。
这个java script的polyfills是不一样的,polyfill是完全java script-land的,比如解决java script新老版本API兼容的问题,把高版本的API通过polyfill使低版本也能使用。但是当有新的语法引入时,比如新版本java script中出现的class关键字,这个是无法通过polyfill进行兼容的。因此在把要想在browser上面使用这些新语法,必须先对source code进行compilation(transpilation),通过这种方式我们就可以直接使用很多ES6的新特性。
Client-side
在浏览器中进行transpilation是最简单的实现方式,但是这个会给用户带来性能方面的不利影响,因此对真实用户来说,不推荐使用这种方式,而是推荐在服务器进行编译。但是这种方式对我们日常开发来说却是非常有利的,不需要设置一大堆的编译步骤。
要在Client-side使用JSX,需要做两件事:1) 包含client JSX transpilation script 2) 使用JSX来标记scripts脚本
在老版本的React中,使用的JSX build脚本是JSXTransformer,新版本使用的是babel(v0.14)。两者使用的方式和语法是基本上来说差异不大,babel除了支持JSX之外,还支持最新的java script版本的各种特性到低版本的java script中。
如果没有JSX build脚本的情况下,在浏览器中包含JSX语法会直接报错的。添加build脚本之后,build脚本会查找并transiles代码中tag类型为”text/jsx”的中的script,将其中的语法从JSX变为正常的java script语法,然后把转换后的java script代码auto-insert到document的中。例如下图这样,可以看出,生成的script同时还包含一个对debug非常有帮助的source map(a mapping of before/after the transformation)。
在上面的例子中是直接使用inline scripts,我们同时还可以使用external scripts,原理和用法跟上面的过程是一样的,例如下面:
但external scripts和inline scripts有一点不同的是,这种方式必须保证代码是部署在一个HTTP服务器上面的,因为build脚本需要使用XMLHttpRequest来
下载
这些external scripts,然后才能进行transform,而XMLHttpRequest的使用是受到
浏览器
的same-origin规则限制的。
JSX transformation
JSX transform 是非常轻量级和简单的,它甚至保留了错误发生的line number,可以通过这个来回溯JSX中的错误根源。babel官方提供的有一个JSX语法转换器:https://babeljs.io/repl/,支持在线从JSX语法转换为React的java script方法调用代码。
还有一个非常有用的在线转换工具:https://facebook.github.io/react/html-jsx.html,在线支持将HTML标签语言转换为JSX语法。
java script in JSX
当我们在构建UI的时候,我们经常需要用到 variables/conditions/loops,我们不需要再去学习另外一门模板语言来处理这个问题,JSX允许我们在JSX内部使用java script语言。只需要把java script代码包含在一个花括号{}内部即可。这个跟一些模板引擎的处理是类似的,如果你之前学过模板的概念的话,就会非常容易理解这个的,JSX相对于那些很?嗦的模板引擎而言是非常简单的。
当我们在JSX中使用相连的 {} blocks 时,JSX在处理时会把它们分别放在
标签中来区分它们。例如 {1}{2},最终在DOM中渲染的时候,会变成
1
2
。
Whitespace in JSX
JSX中的空白跟HTML是类似的,但是又不完全一样。
例子1:
JSX处理之后的样式为:
多个spaces最终会合并为一个,所以最终的渲染结果是“1 plus 2 is 3”
例子2:
JSX处理之后的样式为:
最终的渲染结果是“1plus2is3”
在标签内使用whitespace跟HTML是类似的,有一种解决方式是,在JSX中通过插入java script表达式的方式来添加空格。例如下面两种方式均可:
Comments in JSX
参考官方文档的
阅读
笔记
HTML entities
参考官方文档的阅读笔记
Anti-XSS
参考官方文档的阅读笔记
Spread attributes
参考官方文档的阅读笔记,大部分概念是相同的,里面提到一种很有意思的用法,Parent-to-child spread attributes,即使用parent component的props来给child component传递属性。例如:
可以直接用这些props传递给a标签做属性:
Returning multiple nodes in JSX
在component的render()函数中,我们只能返回一个single node的component,对于multiple nodes,我们可以把它wrap到一个component中再返回。比如下面这里返回多个span的问题:
尽管我们在render( ) 函数中不能返回一个nodes array,但是我们是可以在composition的过程中使用arrays的。只要这个array中的nodes有正常的key属性,同时有一种例外不需要设置key属性,我们可以在这个nodes array中插入whitespace或者strings。例如:
还有一种比较类似的用法,从parent component中接收任意数量的children component,然后把他们在render() 函数中进行渲染,例如:
JSX vs HTML
关于这部分Facebook官方文档中也有讲到,但是讲的不够全面仔细 ,
这本书倒是讲解地非常全面
No Class, what for?
不能使用 class 和 for 作为属性名称,他们是ECMAScript的保留关键字,需要使用 className 和
html
For来代替。
style is an object
style属性接受的值是object value
,不是一个使用 ; 进行分割的string。并且所有
CSS
properties都是使用驼峰法命名的,不能使用dash-delimited。
Closing tags
在HTML中有一些标签是不需要闭合的,但是在JSX中它们则要求必须闭合
,例如
等
camelCase attributes
在JSX中,所有的属性名称都必须是使用驼峰法命名的
。比如:
?
【
大
中
小
】【
打印
】
【
繁体
】【
投稿
】【
收藏
】 【
推荐
】【
举报
】【
评论
】 【
关闭
】 【
返回顶部
】
分享到:
上一篇
:
[LeetCode] Valid Anagram
下一篇
:
[LeetCode] Remove Invalid Paren..
评论
帐 号:
密码:
(
新用户注册
)
验 证 码:
表 情:
内 容:
Copyright@https://www.cppentry.com all rights reserved
粤ICP备13067022号-3
Powered by
qibosoft V7.0
Code © 2003-11
qibosoft