React的第一步
首先了解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的第一步的更多相关文章
- react实战第一步--搭建项目
使用 create-react-app 快速构建 React 开发环境 1.cnpm install -g create-react-app 2.create-react-app react2(rea ...
- 第一步,怎么打开react的大门?
前言 其实我的react的实战经验很少,大概是17年-18年写了一个react全家桶的后台管理系统.猜测这个项目应该还一直在使用 在我手里的vue项目就比较多了,技术栈一直是vue全家桶.最近也在深入 ...
- 开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux
开发thinkphp的时候, 总是会出现各种个样 的奇怪的毛病, 比如: 说什么Application目录不可写, 比如: 说什么 _STORAGE_WRITE_ERROR, 不能生成 Runtime ...
- ElasticSearch第一步-环境配置
ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSearch第四步-查询详解 Elasti ...
- Scala的第一步
第一步:学习使用Scala解释器 开始Scala最简单的方法是使用Scala解释器,它是一个编写Scala表达式和程序的交互式“shell”.在使用Scala之前需要安装Scala,可以参考 Firs ...
- UE4蓝图编程的第一步
认识UE4蓝图中颜色与变量类型: UE4中各个颜色对应着不同的变量,连接点和连线的颜色都在表示此处是什么类型的变量.对于初学者来说一开始看到那么多连接点, 可能会很茫然,搞不清还怎么连,如果知道了颜色 ...
- STM32F407第一步之点亮LED
STM32F407第一步之点亮LED. 要点亮LED,首先了解一下F4的GPIO模块.首先看一下STM32F4数据手册,GPIO模块的内部结构图 看上去有点复杂,不要怕,慢慢理解就可以了.对外引脚那里 ...
- 重制AdvanceWars第一步 -- 搞定地图
首先来聊下高级战争吧Advance Wars,由任天堂旗下的Intelligent Systems开发的战棋游戏.初作诞生于GBA上,后来继续跟进了高战2黑洞崛,而后在下一代掌机DS上也出了三代续作高 ...
- 高德携手阿里云发布“LBS云”,账户打通只是第一步
位置.游戏.视频,是公认的基于云计算的三大移动端应用方向.而今,LBS云有了更多进展,在高价值应用与云平台之间实现了资源打通和融合,高德迈出了实质性的一步. 高德地图副总裁郄建军(左)与阿里云业务总经 ...
随机推荐
- mysql 三个表连接查询
权限表(permission)10 字段名称 类型 约束 描述 authorityid integer Pk not null 权限流水号id PK userNameId int not nul ...
- Python 实现发送、抄送邮件功能
发送邮件 问题 在web.py中,如何发送邮件? 解法 在web.py中使用web.sendmail()发送邮件. web.sendmail('cookbook@webpy.org', 'user@e ...
- 怎么把MVC的Controller拆分写到别的类库
以为很难…… 其实直接继承Controller 并且按MVC_Controllser规则命名. 然后网站项目引用该项目即可.
- Ext Js【Hello World】 ——4.1 beta 1
准备:vs+ExtJs4.1Beta1 ExtJS 4.1 xiazai_ https://yunpan.cn/cqv6bdBwtRjAj (提取码:2733) 引用,cs文件,js主入口,zh—c ...
- MVC基础知识
1.View中获取Control和View: //获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); / ...
- JavaScript - 变量,作用域,内存
JavaScript 变量可以用来保存两种类型的值:基本类型值和应用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Bollean.Number和String. 所有变量都 ...
- js 上传文件后缀名的判断 var flag=false;应用
js 上传文件后缀名的判断 var flag=false;应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...
- hdu 2232 矩阵 ***
一天四个不同的机器人a.b.c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4 块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同 ...
- vim实现全选功能
转自:http://blog.csdn.net/csh159/article/details/7533872 曾经也在找看看有没有快捷的方法全选,但是网上很多都是重复,并且错误的,比如: 1,$y,这 ...
- jsp,图片显示
问题:jsp中显示项目中image文件夹中的图片 1,项目中image文件夹中有对应的图片 2,<img ,src="/项目名/image/图片名.jpg">,用其他变 ...