首先了解React中所牵扯到的几个重要的概念

什么是React?

是Facebook的开发团队开发出来的一个用于构建用户界面个js库,最近才开源出来公布于世,它的初衷是用于创建“独立的视图组件”,一个React组件本质上来说就是拥有一个自己作用域的DOM元素。

JSX?

React 使用的是特殊的 JavaScript. 语法, 叫做 JSX。这个是最吸引我的地方,也是最有创意的地方。React把传统的js编程语言方式换成了JSX,处于好奇,我在网上查看了关于JSX的一些资料,让我顿时一惊,原来JSX性能比js要好很多,下面详细介绍一下。

什么是jsx?

JSX静态类型化,面向对象的编程语言,设计在现代浏览器上运行,简单描述就是Javascript的XML语法扩展。

  特点一: 快

JSX执行优化,编译源代码的javascript。生成的代码运行速度比直接在JavaScript编写的要快,使用了优化的JavaScript库Box2D变得更快,当移植到JSX(在ios 5.1快12%,在Android 2.3快29%)。

Box2D是一个用于模拟2D刚体物体的C++引擎。zlib许可是一个自由软件授权协议。

特点二:更安全

与JavaScript,JSX静态类型化,大多是类型安全的。 应用程序的质量变得更高使用JSX被开发时,由于许多错误在编译过程中会被捕获。 它还提供了编译器级别的调试特性。

如下图,更直观的表达了JSX和JS的区别

在React中用jsx语法糖来编写程序,在JSXTransformer.js文件中会处理成js的语法形式输出

通过例子来说明:

/** @jsx React.DOM */
var component = React.createClass({
render: function() {
return <a href="http://baidu.com">baidu</a>
}
});

转化为

/** @jsx React.DOM */
var component = React.createClass({
render: function() {
return React.DOM.a( {href:"http://baidu.com"}, "baidu")
}
});

注:这里的/** @jsx React.DOM*/看上去像注释,其实是一个标记,必须加上!这告诉JSX为React过程的文件。如果你不包括编译指示、源将保持不变。

在return的时候明显写法出现了差异,转换之后的写法是React.DOM.a;

Why JSX?

为什么用jsx,官方网站给我们一些解释:

1.它是将DOM结构更容易

2.设计师更愿意做出的改变

3.对于那些使用MXML或XAML很熟悉。

当然如果开发者不喜欢用JSX,那就在开发项目中可以不引入JSXTransformer.js文件,但是在编写js脚本的时候就要直接以React.DOM.*函数,下面例子介绍

var link = React.DOM.a({href:'http://facebook.github.io/react'},'React');

注:创建一个a标签,并对其设置一个链接

JSX看上去像HTML,但还是有一些差异的,接下来看下这之间的DOM差异:

React已经实现了一个独立于浏览器的事件,系统性能和跨浏览器兼容性的DOM系统。

1.style属性和构建的属性接受一个javascript对象,而不是CSS的字符串,这个更为高效,并防止XSS攻击。

XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。

2. onchange事件行为,当一个表单字段更改的时候,该事件才触发,打破了现有浏览器的行为操作。

3. 表单组件<input>,<textarea>,<option>等不同于其他本地组件,因为本地组件可以通过用户交互变化,而React中的这些组件单独提供了接口,使它们更容易管理的形式响应用户交互。

在React.js中对DOM元素进行了封装操作,我们要使用哪个DOM元素就必须使用React.DOM.*,  '*'表示DOM元素

看下React对DOM元素的封装吧

var ReactDOM = mapObject({
a: false,
abbr: false,
address: false,
area: true,
article: false,
aside: false,
audio: false,
b: false,
base: true,
bdi: false,
bdo: false,
big: false,
blockquote: false,
body: false,
br: true,
button: false,
canvas: false,
caption: false,
cite: false,
code: false,
col: true,
colgroup: false,
data: false,
datalist: false,
dd: false,
del: false,
details: false,
dfn: false,
dialog: false,
div: false,
dl: false,
dt: false,
em: false,
embed: true,
fieldset: false,
figcaption: false,
figure: false,
footer: false,
form: false, // NOTE: Injected, see `ReactDOMForm`.
h1: false,
h2: false,
h3: false,
h4: false,
h5: false,
h6: false,
head: false,
header: false,
hr: true,
html: false,
i: false,
iframe: false,
img: true,
input: true,
ins: false,
kbd: false,
keygen: true,
label: false,
legend: false,
li: false,
link: true,
main: false,
map: false,
mark: false,
menu: false,
menuitem: false, // NOTE: Close tag should be omitted, but causes problems.
meta: true,
meter: false,
nav: false,
noscript: false,
object: false,
ol: false,
optgroup: false,
option: false,
output: false,
p: false,
param: true,
picture: false,
pre: false,
progress: false,
q: false,
rp: false,
rt: false,
ruby: false,
s: false,
samp: false,
script: false,
section: false,
select: false,
small: false,
source: true,
span: false,
strong: false,
style: false,
sub: false,
summary: false,
sup: false,
table: false,
tbody: false,
td: false,
textarea: false, // NOTE: Injected, see `ReactDOMTextarea`.
tfoot: false,
th: false,
thead: false,
time: false,
title: false,
tr: false,
track: true,
u: false,
ul: false,
'var': false,
video: false,
wbr: true, // SVG
circle: false,
defs: false,
ellipse: false,
g: false,
line: false,
linearGradient: false,
mask: false,
path: false,
pattern: false,
polygon: false,
polyline: false,
radialGradient: false,
rect: false,
stop: false,
svg: false,
text: false,
tspan: false
}, createDOMComponentClass);

这段代码把支持HTML标签创建映射到` reactdomcomponent `类。这里面的代码逻辑后期再详说。

React从最初设计开始就打破了传统观念,运用新的独立方式进行页面的交互操作,这是独特创新,不知道这样的方式会成为未来前端技术的趋势吗?看实践的结果了。

继续激情的前进着。。。

React的第一步的更多相关文章

  1. react实战第一步--搭建项目

    使用 create-react-app 快速构建 React 开发环境 1.cnpm install -g create-react-app 2.create-react-app react2(rea ...

  2. 第一步,怎么打开react的大门?

    前言 其实我的react的实战经验很少,大概是17年-18年写了一个react全家桶的后台管理系统.猜测这个项目应该还一直在使用 在我手里的vue项目就比较多了,技术栈一直是vue全家桶.最近也在深入 ...

  3. 开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux

    开发thinkphp的时候, 总是会出现各种个样 的奇怪的毛病, 比如: 说什么Application目录不可写, 比如: 说什么 _STORAGE_WRITE_ERROR, 不能生成 Runtime ...

  4. ElasticSearch第一步-环境配置

    ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSearch第四步-查询详解 Elasti ...

  5. Scala的第一步

    第一步:学习使用Scala解释器 开始Scala最简单的方法是使用Scala解释器,它是一个编写Scala表达式和程序的交互式“shell”.在使用Scala之前需要安装Scala,可以参考 Firs ...

  6. UE4蓝图编程的第一步

    认识UE4蓝图中颜色与变量类型: UE4中各个颜色对应着不同的变量,连接点和连线的颜色都在表示此处是什么类型的变量.对于初学者来说一开始看到那么多连接点, 可能会很茫然,搞不清还怎么连,如果知道了颜色 ...

  7. STM32F407第一步之点亮LED

    STM32F407第一步之点亮LED. 要点亮LED,首先了解一下F4的GPIO模块.首先看一下STM32F4数据手册,GPIO模块的内部结构图 看上去有点复杂,不要怕,慢慢理解就可以了.对外引脚那里 ...

  8. 重制AdvanceWars第一步 -- 搞定地图

    首先来聊下高级战争吧Advance Wars,由任天堂旗下的Intelligent Systems开发的战棋游戏.初作诞生于GBA上,后来继续跟进了高战2黑洞崛,而后在下一代掌机DS上也出了三代续作高 ...

  9. 高德携手阿里云发布“LBS云”,账户打通只是第一步

    位置.游戏.视频,是公认的基于云计算的三大移动端应用方向.而今,LBS云有了更多进展,在高价值应用与云平台之间实现了资源打通和融合,高德迈出了实质性的一步. 高德地图副总裁郄建军(左)与阿里云业务总经 ...

随机推荐

  1. Hadoop CDH5 集群管理

    Hadoop 是一个开源项目,所以很多公司在这个基础进行商业化,Cloudera 对 Hadoop做了相应的改变.Cloudera 公司的发行版,我们将该版本称为 CDH(Cloudera Distr ...

  2. Hive学习路线图(转)

    Hadoophivehqlroadmap学习路线图   1 Comment Hive学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig ...

  3. 关于JAVA的String类的一些方法

    一.得到字符串对象的有关信息 1.通过调用length()方法得到String的长度. String str=”This is a String”; int len =str.length(); 2. ...

  4. c++11中的static

    超赞的线程安全的初始化 static plsa::PLSAModel& model() { static plsa::PLSAModel _model = ([&]() { plsa: ...

  5. HTML5学习之视频与音频(三)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. Delphi编程建议遵守的规范2---命名规范

    1.1.形参命名建议 所有形参的名称都应当表达出它的用途.如果合适的话,形参的名称最好以字母a 为前缀,例如: procedure SomeProc(aUserName:string; aUserAg ...

  7. java-解决业务操可能数据冲突问题

    问题提出,由于业务会出现多人同时操作,或者业务人员反复的操作,因此在业务流程中,需要对业务操作数据进行保护,由于使用数据库锁可能会引起一些难以预料的问题,因此考虑使用内存锁,设计思想:在内存中使用一个 ...

  8. ytu 1058: 三角形面积(带参的宏 练习)

    1058: 三角形面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 190  Solved: 128[Submit][Status][Web Boar ...

  9. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12731   Accepted: 544 ...

  10. [LeetCode] Word Pattern

    Word Pattern Total Accepted: 4627 Total Submissions: 17361 Difficulty: Easy Given a pattern and a st ...