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云有了更多进展,在高价值应用与云平台之间实现了资源打通和融合,高德迈出了实质性的一步. 高德地图副总裁郄建军(左)与阿里云业务总经 ...
随机推荐
- 解决eclipse Maven 主项目不能刷新maven
项目->.project -> 增加<?xml version="1.0" encoding="UTF-8"?><projectD ...
- Jams倒酒
Jams是一家酒吧的老板,他的酒吧提供2种体积的啤酒,a ml 和 b ml,分别使用容积为a ml 和 b ml的酒杯来装载. 酒吧的生意并不好.Jams发现酒鬼们都很穷,不像他那么土豪.有时,他们 ...
- jquery获得select option的值 和对select option的操作
jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change(function(){//code...}); //为Se ...
- 二、JavaScript语言--JS实践--倒计时效果
主要内容:分析不同倒计时效果的计算思路及方法,掌握日期对象Date,获取时间的方法,计算时差的方法,实现不同的倒时计效果. Javascript 日期对象: Date()返回当前的日期和时间 getY ...
- localStorage的使用
HTML5中提供了localStorage对象可以将数据长期保存在客户端,直到人为清除. localStorage提供了几个方法: 1.存储:localStorage.setItem(key,valu ...
- highcharts的简单使用
在使用过的图表js插件中,个人认为还是highcharts最好,无论从兼容性,渲染速度,甚至是文档详细上来说,都一直觉得highcharts更胜一筹.现在花点时间做一下简单的总结,比如从一个矩形图开始 ...
- .net学习笔记---xml序列化
XML序列化是将对象的公共属性和字段转换为XML格式,以便存储或传输的过程.反序列化则是从XML输出中重新创建原始状态的对象.XML序列化中最主要的类是XmlSerializer类.它的最重要的方法是 ...
- DOM - 5.事件冒泡 + 6.事件中的this
5.事件冒泡 如果元素A嵌套在元素B中,那么A被点击不仅A的onclick事件会被触发,B的onclick也会被触发.触发的顺序是"由内而外" .验证:在页面上添加一个table. ...
- Dubbo集成Spring与Zookeeper实例
>>Dubbo最佳实践 使用Dubbo结合Zookeeper和Spring,是使用比较广泛的一种组合,下面参考官方文档,做个简单的示例,一步步搭建一个使用dubbo结合Zookeeper和 ...
- 【翻译二十】-java线程池
Thread Pools Most of the executor implementations in java.util.concurrent use thread pools, which co ...