facebook开源前端UI框架React初探
最近最火的前端UI框架非React莫属了。赶紧找时间了解一下。
项目地址:http://facebook.github.io/react/
官方的介绍:A JavaScript library for building user interfaces (前端UI的js框架)
具有三个特点:
Just the UI
Lots of people use React as the V in MVC. Since React makes no assumptions about the rest of your technology stack, it's easy to try it out on a small feature in an existing project. (一般人们将React用于实现前端MVC中的view中,因为React并不假定你使用的其它前端技术堆栈,所以很容易在已经存在的项目中试用。)
Virtual DOM
React abstracts away the DOM from you, giving a simpler programming model and better performance. React can also render on the server using Node, and it can power native apps using React Native. (使用React我们并不直接操作浏览器中的DOM,React引入了虚拟DOM的概念,我们使用js代码直接生成虚拟DOM节点,然后React负责将虚拟DOM节点到实际DOM节点的转换,这样的话,使前端UI编程更加的简单而且性能更好。)
Data flow
React implements one-way reactive data flow which reduces boilerplate and is easier to reason about than traditional data binding.(React实现单向的数据流,从而减少了传统数据绑定的模板文件,而且更加容易理解)
其实我自己的理解是:React是一个将前端UI组件化的框架,它可以将页面上的各种UI实现为一个一个的组件,我们向组件传入数据,React负责生成对应的UI,然后进行渲染。实现方式是虚拟DOM和单向数据流,虚拟DOM提供了更好的性能,因为比如一个UI组件包含多个html标签元素,如果我们需要修改其中的几个标签中的数据的话,就会对DOM操作几次(比如使用jquey),然而使用虚拟DOM,我们是先在内存中生成整个UI组件,然后一次性将虚拟DOM转换渲染到实际DOM,所以对实际DOM的操作只有一次。单向数据流是指没有数据的双向绑定,数据只从Model向View传送,每次更新都是使用一个全新的UI组件替换页面上旧的UI组件,更加的简单。
其实React最大特点是:UI组件化和UI整体替换的更新方式,然后才是性能更好,更加简单。组件化就容易维护,方便重用。
实例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="build/react.js"></script>
<script src="build/JSXTransformer.js"></script>
</head>
<body>
<div id="example"></div> <script type="text/jsx">
React.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
</body>
</html>
上面代码导入React的js库react.js,而JSXTransformer.js是将页面上 type="text/jsx" 的代码转换成 text/javascript 代码的转换库。转换可以再浏览器端进行,也可以使用Nodejs再服务端进行。实际项目运行都是在服务端进行转换。我们先看下在浏览器端进行转换的效果:
可以看到React成功渲染出了一个UI组件,但是下面提示我们应该先在服务端预编译 jsx 脚步。
然后我们再看服务端转换预编译 jsx 方法:
安装Node.js:到 https://nodejs.org/ 下载对应平台的安装文件:node-v0.12.2-x86.msi
我是win7 64位,双击一路下一步安装完成。配置系统路径,将 D:\nodejs 加入 path, 新建系统变量:NODE_PATH,值为:D:\nodejs\node_modules\
安装 react-tools: npm install react-tools
安装成功如下图:
再预编译 jsx 脚本之前,我们将它提取出来,单独放入一个文件:helloworld.js
React.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
然后调用react-tool中的 jsx 脚本来编译:
上面将 当前目录下的 jsxfile 文件夹中的所有的 jsx 脚本编译到 当前目前下的 result 文件夹下,编译之后的代码为:
React.render(
React.createElement("h1", null, "Hello, world!"),
document.getElementById('example')
);
React.createElement("h1", null, "Hello, world!") 表示生产一个 h1 标签,内容为 "Hello, world!",然后React.render(),将生产的h1标签渲染插入到document.getElementById('example')节点下去。最后的helloworld.html的内容为:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="build/react.js"></script>
</head>
<body>
<div id="example"></div> <script type="text/javascript">
React.render(
React.createElement('h1', null, 'Hello, world!'),
document.getElementById('example') // $("#example")[0]
);
</script>
</body>
</html>
注意这里我们将 JSXTransformer.js 文件去掉了,并且将 text/jsx 改成了 text/javascript. 当然我们也可以将编译生产的js单独放入一个文件,然后使用 <script type="text/javascript" src="xxx"> 引入到页面。
效果为:
下面我们分析下Github上使用React实现的Tab选择器
地址:https://github.com/supnate/react-tab-selector该例子很好的说明了React的基本用法
源码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="js/react.js"></script>
<script src="js/JSXTransformer.js"></script>
<link rel="stylesheet" tpe="text/css" href="style.css"/>
</head>
<body>
<div id="container"></div> <script type="text/jsx">
var data = [
{name: 'Red', value: 'red'},
{name: 'Blue', value: 'blue'},
{name: 'Yellow', value: 'yellow'},
{name: 'Green', value: 'green'},
{name: 'White', value: 'White'}
]; var TabSelector = React.createClass({
getInitialState: function() {
return {selected: this.props.selected};
}, handleOnClick: function (evt) {
this.setState({'selected': evt.target.getAttribute('data-value')})
}, render: function() {
var tabs = this.props.data.map(function (item) {
var selected = item.value == this.state.selected ? 'selected' : '';
return <li data-value={item.value} className={selected} onClick={this.handleOnClick}>
{item.name}
</li>;
}, this); return <div className="tab-selector">
<label>{this.props.label}</label>
<ul>{tabs}</ul>
</div>;
}
}); React.render(
TabSelector({label: 'Color', data: data, selected: null}),
document.getElementById('container')
);
</script>
</body>
</html>
这个例子涉及到很多的React基础知识:
TabSelector({label: 'Color', data: data, selected: null}) 相当于一个组件的构造函数,传入我们从后台获得的数据(一个json对象),在组件TabSelector的实现中有各种函数,这些函数中访问我们传入的数据的方式是:this.props.label, this.props.data, this.props.selected。render方法的实现,就是使用传入的数据,然后返回我们需要在页面上渲染的UI组件,this.props.data.map() 这里使用了javascript中数组的map函数来处理每一个数组项,每次得到 <li></li> ,所以返回的var tabs的结果是一个 <li></li> 的数组。最后通过
return <div className="tab-selector">
<label>{this.props.label}</label>
<ul>{tabs}</ul>
</div>;
返回最终生成的UI组件。这里使用 var 定义的变量 tabs 的访问方式是:{tabs},访问传入的数据的方式也是 {this.props.label}。每一个<li></li>标签上定义了 onClick={this.handleOnClick} 点击的处理方法,而 handleOnClick的实现为,每次点击时,就使用被点击的<li></li>元素的data-value 属性的值来更新自己的 className={selected} 中的 {selected},从而实现被点击时就改变它的样式。而这个实现中调用了setState()方法,这个方法是React库中的方法,它被调用时,如果state的状态发生了变化,那么就会对UI组件使用新的state进行重新渲染。
在getInitialState函数中定义了该组件的state的初始状态(selected属性的值),该函数在组件初始化时调用:
getInitialState: function() {
return {selected: this.props.selected};
},
而 this.setState({'selected': evt.target.getAttribute('data-value')}) 会修改该组件的状态state的值,组件的state变化的话,会导致组件UI的刷新,重新生成,然后插入DOM。实际页面如下图:
点击某个 tab 的效果如下图:
所以总结一下:
1)getInitialState 函数用于定义组件的state;
2)render 函数定义了根据传入的数据生成UI组件的方法;
3)而 setState 函数会修改组件的state,从而触发组件UI的刷新,重新调用render方法;
4)handleOnClick 函数定义了点击事件的处理;
5)访问传入的数据的方法:{this.props.xx}
6)访问js变量的方法: {variable}
7)css 中的 class 要使用 className 替换,不能直接使用 class
8)React.createClass 创建组件(类),使用了面向对象的概念来进行处理,创建一个组件,就相当于实例化一个对象,类就是“组件类”,组件就是“对象”
9)访问state的属性方法:{this.state.xxx}
10)React的jsx脚本的写法,和 html 页面的写法是相似的,并不像在js中那样需要引号来包含,这样方便我们直接将前端的 html 页面使用React来组件化
我们可以比较一下采用jquery的写法:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="js/jquery.min.js"></script>
<link rel="stylesheet" tpe="text/css" href="style.css"/>
</head>
<body>
<div id="container"></div> <script type="text/javascript">
var data = [
{name: 'Red', value: 'red'},
{name: 'Blue', value: 'blue'},
{name: 'Yellow', value: 'yellow'},
{name: 'Green', value: 'green'},
{name: 'White', value: 'White'}
]; $.fn.TabSelector = function (options) {
var arr = ['<div class="tab-selector">'];
arr.push('<label>', options.label, '</label>');
arr.push('<ul>');
options.data.forEach(function (item) {
arr.push('<li data-value="', item.value, '">');
arr.push(item.name);
arr.push('</li>');
});
arr.push('</ul></div>'); this.html(arr.join('')); var lastSelected = null;
this.on('click', 'li', function () {
var $this = $(this);
if (lastSelected) {
lastSelected.removeClass('selected');
}
$this.addClass('selected');
lastSelected = $this;
}); return this;
} $('#container').TabSelector({data: data, selected: null, label: 'Color'});
</script>
</body>
</html>
明显感觉到jquery也就是javascript在拼接 html 代码时的繁琐,总是需要使用引号来处理,而React的jsx写法和html几乎一样。
有价值的参考链接:
React实现的理论知识:http://www.infoq.com/cn/articles/subversion-front-end-ui-development-framework-react
React的介绍:http://www.cnblogs.com/chyingp/p/react-getting-started.html
官网:http://facebook.github.io/react/
facebook开源前端UI框架React初探的更多相关文章
- 前端UI框架和JS类库
一.前端框架库: 1.Zepto.js 地址:http://www.css88.com/doc/zeptojs/ 描述:Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jqu ...
- 前端UI框架小汇总
前言: 近期,小弟根据GitHub.前端社区.掘金等平台对当前流行的前端UI框架的进行了小小的整理和汇总(ps:前端UI框架的应用是通过GitHub star数,社区热度和使用范围等进行的粗略的汇总[ ...
- 前端UI框架选择区别对比推荐
UI选择务必慎重,货比三家. 弱水三千只取一瓢:弱水三千只取一瓢,源起佛经中的一则故事,警醒人们在一生中可能会遇到很多美好的东西,但只要用心好好把握住其中的一样就足够了 老牌构建于jQuery框架之上 ...
- 很受欢迎的vue前端UI框架
最近在逛各大网站,论坛,SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,小编自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在做自己 ...
- 2018年九个很受欢迎的vue前端UI框架
最近在逛各大网站,论坛,SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,小编自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在做自己 ...
- 2019前端UI框架排行榜
一.Mint UI 流行指数:★★★★ Mint UI是 饿了么团队开发基于 Vue.js 的移动端UI框架,它包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要. 官网:https:/ ...
- 2015年最全的移动WEB前端UI框架
目前,众多互联网公司APP都嵌入了大量的HTML5,移动端的开发越来越重视,HTML5的运用场景也越来越多了.在移动WEB开发的过程中,使用合适的移动WEB UI框架可以大大提升我们的开发效率.下面P ...
- 前端UI框架《Angulr》入门
Angulr 项目的名称为 Angulr,对!没错!就是少个 a,少个 a 就是它正确的拼写. 是一个以 Bootstrap 和 AngularJS 为基础,并使用了大量前端开源组件合成的一个前端UI ...
- web前端UI框架
分类:WEB前端 时间:2016年1月13日 目前,众多互联网公司APP都嵌入了大量的HTML5,移动端的开发越来越重视,HTML5的运用场景也越来越多了.在移动WEB开发的过程中,使用合适的移动WE ...
随机推荐
- Angular系列----AngularJS入门教程04:迭代器过滤(转载)
我们在上一步做了很多基础性的训练,所以现在我们可以来做一些简单的事情喽.我们要加入全文检索功能(没错,这个真的非常简单!).同时,我们也会写一个端到端测试,因为一个好的端到端测试可以帮上很大忙.它监视 ...
- ASP.NET MVC5利用EF,反向自动生成数据库
1.在Model类里面,写好相应的属性. using System; using System.Collections.Generic; using System.Linq; using System ...
- .NET程序的编译和运行
程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然 ...
- JS获取html对象的几种方式说明
document.getElementById("zx"); 通过ID获取html元素对象,ID号在html文档当中应该是唯一的.返回的是唯一element对象.并且所有浏览器都兼 ...
- RSA密钥——JAVA与C#的区别和联系
PS:好久没写博了,最近在考虑以后的事情,而且手上杂事也比较多,终于得空来写两篇. 首先感谢:http://www.codeproject.com/Articles/25487/Cryptogra ...
- JPA学习(2)注解
上一篇学习了JPA的helloworld,也初略的使用了一些注解,接下来就细细的了解一下有哪些注解,和这些注解的作用 JPA的基本注解: ①@Entity,@Table,@Id,@GeneratedV ...
- 配置了<mvc:resources> 导致以前的controller 无法访问。
解决方案: <mvc:annotation-driven/>
- php学习笔记:利用递归实现删除文件目录
直接删除目录,如果是空目录是可以删除,如果不是空目录,这时候只能先删除目录里面的文件,然后再删除目录.我封装了个删除函数,然后直接调用这个函数.喜欢的可以直接拿去用,编码是gbk的,使用时候注意下编码 ...
- 桂电在linux、Mac OS环境下使用出校器(支持2.14)
这是guetsec学长在三院科协学长所抓包逆向分析1.81版出校器的基础上,用python写的一款为Mac和linux环境开发的出校器. 最后我做了略微修改,支持暂时最新版本2.14.下面有直接从源码 ...
- 轻量级SaaS在线作图工具(继之前介绍后完整介绍)
俗话说“一图胜千言”,在办公应用领域,流程图是一个非常好的表现企业业务流程或工作岗位规范等内容的展现形式,比如去给客户做调研,回来后都要描述出客户的关键业务流程,谁.什么时候.在什么地方.负责什么事情 ...