React JS快速开始手册
怎样用React JS构建一个用户界面?本文将快速地给你一个React JS的概览。代码,请君移步react-starter
概念
React只有很少的API,这使得它很容易去学习与理解。当然,使用它也是相当有意思的。但是,简约却并不简单。在我们开始之前,有一些概念是需要去理解的。
React元素(React elements)
React元素是用于呈现HTML结构的JavaScript对象。它们不会存在于浏览器中,只是用于描述浏览器中的元素,比如h1, div 或者 section等等。
模块(Components)
模块是开发者创建的React元素。它们通过比用户界面的范围要大,因为它们同时包含了其结构与功能。想像一下导航栏,点赞按钮,图片上传这些模块的概念。
JSX
JSX是一种用于创建React元素和模块的技术,或者说是规范、语言。比如 <h1>Hello</h1> 便是一个用JSX所写的React元素。同样的React元素,可以用原生的JavaScript实现,即 React.DOM.h1(null, 'Hello');。相比原生的JavaScript,JSX更加简洁。会让你花更少的精力去读和写代码,在上线的时候将其转换成原生的JavaScript即可。
虚拟DOM(Virtual DOM)
虚拟DOM是一个JavaScript的树形结构,包含了React元素和模块。React通过渲染虚拟DOM到浏览器,使得用户界面得以显示。React也会观察虚拟DOM的变化,根据虚拟DOM自动地改变浏览器DOM元素。
了解了这些概念之后,我们就可以畅快地敲React代码了。这里将会创建一系列的用户界面,每一个界面都将提前添加一层功能层。我们会做一个类似instagram的应用 - 当然,这个很粗糙。
渲染(Rendering)
业务的第一步是渲染一个虚拟的元素(React元素或者模块都可以)。由于每一个虚拟元素都存在于内存之中,所以我们必须显式地告诉React,将其渲染到浏览器的DOM之中。
React.render(<img src='http://owenyang0.github.io/img/background.jpg' />, document.body);
render 函数接受两个参数,一个是虚拟元素,一个是真实的DOM节点。React就是获取到虚拟元素之后,将其插入到所给的节点之中。此时,在浏览器中便可以看到照片了。
模块(Components)
模块是React的核心与灵魂。它们可以自定义React元素。经常由单一的功能或者结构扩展而来。
var Photo = React.createClass({
render: function() {
return <img src='http://owenyang0.github.io/img/background.jpg' />
}
});
React.render(<Photo />, document.body);
createClass 函数接受一个对象,该对象实现了render 的函数。
这个Photo模块被构建好,<Photo />,然后渲染到document body中。
该模块并没有比上一个React图像元素做更多的事情,但这却更加有利于在功能和结构上进行扩展。
属性(Props)
属性可以认为是模块的一些配置选项。它们以参数(arguments)的形式传递给模块,看起来就像HTML的属性(attributes)。
var Photo = React.createClass({
render: function() {
return (
<div className='photo'>
<img src={this.props.imageURL} />
<span>{this.props.caption}</span>
</div>
)
}
});
React.render(<Photo imageURL='http://owenyang0.github.io/img/background.jpg' caption='Headset' />, document.body);
在render 函数里面,两个属性(props)传到了Photo模块,imageURL 和 caption。imageURL属性被用作React元素中的src。而caption属性则以纯文本的方式在React中的span元素使用。
值得一提的是,模块永远不应该去改变属性的的值,它们是不可变的。如果一个模块有一个可变的数据,那应该应用使用状态对象(state object)。
状态(State)
状态对象是一个模块的内部对象。它会持有可变的数据。
var Photo = React.createClass({
toggleLiked: function() {
this.setState({
liked: !this.state.liked
});
},
getInitialState: function() {
return {
liked: false
}
},
render: function() {
var buttonClass = this.state.liked ? 'active' : '';
return (
<div className='photo'>
<img src={this.props.src} />
<div className='bar'>
<button onClick={this.toggleLiked} className={buttonClass}>
♥
</button>
<span>{this.props.caption}</span>
</div>
</div>
)
}
});
React.render(<Photo src='http://owenyang0.github.io/img/background.jpg' caption='Headset'/>, document.body);
在模块中引入状态,会增加一点点的复杂度。
在这模块中,有一个新的函数getInitialState。当模块初始化的时候,React会调用这个函数。而返回的对象则作为React的初始化状态(看函数名就知道)。
还有一个新的函数叫toggleLiked。这个函数调用了模块上的setState方法,可以改变状态liked的值。
通过模块的render函数,变量buttonClass被赋值成了'active'或者空,这都依赖于liked状态。
buttonClass是React按钮元素的class名字。按钮还拥有一个onClick的事件回调,指向toggleLiked函数。
当模块渲染成浏览器DOM的时候,究竟发生全过程:
- 当按钮点击被触发时,调用了
toggleLiked liked的状态被改变- React将模块再次渲染成虚拟DOM
- 新的虚拟DOM与旧的虚拟DOM相比较
- React将改变的部分隔离,然后更新到浏览器DOM
在这个场景中,React会改变button上的类名。
组合(Composition)
组合的意思是说,将小的分散的模块组成一个大的整体。比如Photo模块可以在PhotoGallery中使用:
var Photo = React.createClass({
toggleLiked: function() {
this.setState({
liked: !this.state.liked
});
},
getInitialState: function() {
return {
liked: false
}
},
render: function() {
var buttonClass = this.state.liked ? 'active' : '';
return (
<div className='photo'>
<img src={this.props.src} />
<div className='bar'>
<button onClick={this.toggleLiked} className={buttonClass}>
♥
</button>
<span>{this.props.caption}</span>
</div>
</div>
)
}
});
var PhotoGallery = React.createClass({
getDataFromServer: function() {
return [{
url: 'http://owenyang0.github.io/img/background.jpg',
caption: 'Headset'
},
{
url: 'http://owenyang0.github.io/images/mocha.png',
caption: 'Mocha'
},
{
url: 'http://owenyang0.github.io/images/catalog.png',
caption: 'Catelog'
}];
},
render: function() {
var data = this.getDataFromServer();
var photos = data.map(function(photo) {
return <Photo src={photo.url} caption={photo.caption} />
});
return (
<div className='photo-gallery'>
{photos}
</div>
)
}
});
React.render(<PhotoGallery />, document.body);
这个Photo模块完完全全和上面的一样。但新的PhotoGallery模块会生成Photo模块。该场景中,伪造了返回包含三个对象的数组的数据,每一个对象都返回一个url和其标题。通过循环,生成了三个Photo的模块,将最终的返回值插入到render函数之中。
小结
用React来构建你的用户界面,我想这也差不多了。React的文档手册,包含了所有的细节。强烈推荐大家去读一下。
同样的,该文也没有涉及你本地环境安装的细节。文档都会有的。
React JS快速开始手册的更多相关文章
- React JS快速入门教程
翻译至官方文档<Tutorial>http://facebook.github.io/react/docs/tutorial.html 转载请注明出处:http://blog.csdn.n ...
- MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录
注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...
- React JS和React-Native学习指南
自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南本指南汇集React- ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
- 使用 React.js 的渐进式 Web 应用程序:第 1 部分 - 介绍
使用 React.js 的渐进式 Web 应用程序:第 1 部分 - 介绍 使用 React.js 的渐进式 Web 应用程序:第 1 部分 - 介绍 来自译者 markzhai:大家也知道最近 ...
- 谈谈 React.js 的核心入门知识
近来React.js变得越来越流行,本文就来谈一谈React.js的入门实践,通过分析一些常用的概念,以及提供一些入门 的最佳编程编程方式,仅供参考. 首先需要搞懂的是,React并不是一个框架,Re ...
- [转载]Sublime Text 3 搭建 React.js 开发环境
[转载]Sublime Text 3 搭建 React.js 开发环境 Sublime有很强的自定义功能,插件库很庞大,针对新语言插件更新很快,配合使用可以快速搭建适配语言的开发环境. 1. babe ...
- Sublime Text 3 搭建 React.js 开发环境
sublime有很强的自定义功能,插件库很庞大,针对新语言插件更新很快,配合使用可以快速搭建适配语言的开发环境. 1. babel 支持ES6, React.js, jsx代码高亮,对 JavaScr ...
- react.js 你应知道的9件事
React.js 初学者应该知道的 9 件事 本文假定你已经有了一下基本的概念.如果你不熟悉 component.props 或者 state 这些名词,你最好先去阅读下官方起步和手册.下面的代码 ...
随机推荐
- c#/js代码命名规范及代码规范
常用命名 列表,lUser 数组,arrUser 字符串,strTitle 用,分割的字符串,strStatuss(多个用逗号分割的状态) C# Entity层 统一以E开始,比如EUser,EOrd ...
- STM32之输入捕获以及小小应用(库)
五一之际,先祝大家五一快乐.其实快乐很简单,工作的人有假放,学习的人也有假放,像我,有假放才有更多的时间学自己想学的东西.51假期学51,可惜没有32假期呀.好了..言归正传,大家听过吸星大法吧..在 ...
- python pickle和json的区别
pickle可以在python之间进行交互 json可以实现python与不同开发语言的交互 pickle可以序列化python中的任何数据类型 json只能序列化python中的常归数据类型(列表等 ...
- mathlab之floor,ceil,round,int以及fix函数
建议自己动手敲敲,网上很多人自己都没搞清楚然后好多错的.毕竟自己亲眼看到结果才有说服力. 以下是我亲眼见到的结果. 1.double floor(double)函数 floor()函数是常用的取整函数 ...
- 应用程序无法正常启动0xc0150002(windows server 2003)
windows server 2003运行一个程序时出现 "应用程序无法正常启动0xc0150002"的错误提示; 解决方案: 下载地址:http://www.microsoft. ...
- 利用DOS批处理实现定时关机操作
10月1放假回来,寝室晚上10:30就停电了,最无法让人理解的是第二天早上8:00才来电.原来晚上电脑都是不关机的,开着WiFi一直到天亮,可是现在不行了,电脑如果一直开着第二天早上起来电脑肯定没电, ...
- 成为OpenStack工程师
OpenStack Hacker 态度:开放.主动.沟通 影响力:能说.能写.能分享 四化:自动化.流程化.系统化.文档化 0级 掌握一些基本技能:python.c.linux.git.unittes ...
- 多线程导出大规模excel文件
文章有点水,和前几篇没有太大区别,但是单线程处理大文件导出会非常耗时间,用到多线程才能更加合理的利用资源.大文件也可能会超出excel工作表范围.这里也有相应处理 参考:用DataGridView导入 ...
- node基本理念(事件、多线程、进程)
关于node的几点理解: 1.所谓的node单线程,是指node的event loop,也就是我们的业务脚本是跑在一个单线程中的,可以理解为主线程: 2.若存在IO操作,例如文件.网络,是单独在线程里 ...
- ASP.Net MVC开发基础学习笔记:四、校验、AJAX与过滤器
一.校验 — 表单不是你想提想提就能提 1.1 DataAnnotations(数据注解) 位于 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据 ...