React快速入门简介

简介: React快速入门简介

一、简介


React是Facebook开源的一个用于构建用户界面的Javascript库,已经 应用于

Facebook及旗下Instagram。

和庞大的AngularJS不同,React专注于MVC架构中的V,即视图。 这使得React很

容易和开发者已有的开发栈进行融吅。

React顺应了Web开发组件化的趋势。应用React时,你总是应该从UI出发抽象出不

同 的组件,然后像搭积木一样把它们拼装起来。

不过,React定义组件的方式和AngularJS截然不同。如果说HTML是一个轮子,

AngularJS 的指令/Directive则是给这个轮子镶了个金边,而React,重新造了个轮

子: JSX。

React抛弃HTML另起炉灶的原因之一是性能的考虑:DOM操作非常之慢。React引入了 虚拟DOM的概念:开发者操作虚拟DOM,React在必要的时候将它们渲染到真正的 DOM上 —— 有点像游戏开发中的双缓冲区/Double Buffer帧重绘。 引入虚拟DOM的另一个好处是,容易引入不同的渲染引擎。

二、Hello React!


和AngularJS相比,上手React简单到让人震惊。

在引入React库之后,开发API就通过React对象暴露出来了。我们要做的、能做的,就是:

在虚拟DOM上创建元素,然后将它们渲染到真实DOM上。

在示例代码中使用了React对象的两个方法:

, createElement(type,[props],[children...]) - 在虚拟DOM上创建指定的React元素

参数type用来指定要创建的元素类型,可以是一个字符串戒一个React组件类型。当使用 字符串时,这个参数应当是标准的HTML标签名称,比如:p、div、canvas等等。

参数props是可选的JSON对象,用来指定元素的附加属性,比如样式、CSS类等等。 我们在示例中简单的设置为null。

从第三个参数children开始的所有参数,都被认为是这个元素的子元素。考虑到 虚拟DOM好歹也是DOM,容易理解React需要通过这些子元素参数,让我们可以构造虚拟DOM树:

var el = React.createElement(_x000D_ "ul",_x000D_ null,_x000D_ React.createElement("li",null,"China"),_x000D_ React.createElement("li",null,"Japan"),_x000D_ React.createElement("li",null,"Korea")_x000D_);
复制代码

上面的例子在虚拟DOM中创建了一个具有三个li子元素的ul元素,看起来有点累。不过 想想,造一个轮子,总会付出一些代价的。

在示例中,我们简单地传入了一个文本子元素作为p元素的内容。

, render(element,container,[callback]) - 将虚拟DOM上的对象渲染到真实DOM上

参数element是我们使用createElement()方法创建的React元素,注意,不是HTML元素!

参数container是真实DOM中的HTML元素,作为渲染的目标容器,它的内容将被render()方法 的执行改变。

callback参数是可选的函数,当渲染完成戒更新后被执行,通常我们不用它。

三、虚拟DOM


虚拟DOM是React的基石。

之所以引入虚拟DOM,一方面是性能的考虑。Web应用和网站不同,一个Web应用 中通常会在单页内有大量的DOM操作,而这些DOM操作很慢。

在React中,应用程序在虚拟DOM上操作,这让React有了优化的机会。简单说, React在每次需要渲染时,会先比较当前DOM内容和待渲染内容的差异, 然后再决定如何最优地更新DOM。这个过程被称为reconciliation。

除了性能的考虑,React引入虚拟DOM更重要的意义是提供了一种一致的开发方 式来开发服务端应用、Web应用和手机端应用:

6d0235f8239ae92580f10ab2c20d091.png

因为有了虚拟DOM这一层,所以通过配备不同的渲染器,就可以将虚拟DOM的内容 渲染到不同的平台。而应用开发者,使用JavaScript就可以通吃各个平台了。 相当棒的思路!

四、React组件


在React中定义一个组件也是相当的容易,组件就是一个 实现预定义接口的JavaScript类:

1. React.createClass(meta)

参数meta是一个实现预定义接口的JavaScript对象,用来 对React组件原型进行扩展。

在meta中,至少需要实现一个render()方法,而这个方法, 必须而且只能返回一个有效的React元素。

这意味着,如果你的组件是由多个元素构成的,那么你必须在外边包一个顶层 元素,然后返回这个顶层元素。比如我们创建一个布局组件:

render:function(){_x000D_ return React.createElement(_x000D_ "div",null,_x000D_ React.createElement("div",null,"header"),_x000D_
React.createElement("div",null,"content"),_x000D_ React.create
Element("div",null,"footer")_x000D_ );_x000D_}
复制代码

注意 :你的React组件名称的首字母应当大写, 关于大小写的差异你会在后面发现。

在示例代码中,我们实现了一个液晶显示组件EzLedComp,为了更逼真一些, 定义了简

单的样式,别忘了翻看一下,,你应该会注意到div元素的样式类是用 className而不

是class声明的,这是因为class 是JavaScript的保留字,渲染后,真实的DOM还会

是:

<div class="ez-led">Hello, React!</div>
复制代码

组件定义以后,和标准HTML标签一样,可以使用createElement()方法 创建元素,只

是这时,第一个参数是我们定义的组件类,而不是标签名字符串:

React.createElement(EzLedComp);

五、轮子来了:JSX


React引入虚拟DOM以后,创建DOM树得在JavaScript里写代码,这使得界面定义

变得相当繁琐。比如我们创建两排的液晶组件得这么写:

render: function(){_x000D_ return React.createElement(_x000D_ "d

iv",null,_x000D_ React.createElement("div",{className:"ez-led"},"He

llo, React!"),_x000D_ React.createElement("div",{className:"ez-led"},"2015-04-15")_x000D_ );_x000D_}

而它们被渲染后对应的声明式HTML则简单明了:

<div><div class="ez-led">Hello, React!</div><div class="ez-led">2015-04-15
</div></div>
复制代码

这还只是两层的树,要是需要一棵大树呢?

ace82b6f0bb0f091e2afd6aa9ad5c86.png

填一个坑,需要挖另一个坑。于是,JSX来了。

JSX是对JavaScript语法的扩展,它让我们可以在JavaScript代码中以类似HTML 的方式创建React元素。简单的说,每当你需要使用createElement()时, 就把这个函数调用部分用渲染目标HTML替换,提醒下,不完全一致,比如class属性 要用className代替,:

//JavaScript
var e = React.createElement(_x000D_ "ul",null,_x000D_ React.createElement("li",null,"China"),_x000D_ React.createElement("li",null,"Japan"),_x000D_ ); 
//JSX = JavaScript + XML like extension var e = <ul>_x000D_ <li>China</li>_x000D_ <li>Japan<
/li>_x000D_ </ul>;
复制代码

说实话,这种写法让代码看起来相当闹心。但相比写大段的脚本来创建DOM树, 这至少效率高吧。好在,React不强制使用JSX,如果你是强迫症患者, 确实感觉到不舒服,那么,可以不用它。

六、使用JSX


很显然,增加了这些XML语法的脚本不能再称为JavaScript了,使用上 略有区别。 , 指定脚本类型

在html文件中引入的JSX脚本,需要指定类型为text/jsx:

//内联脚本_x000D_<script type="text/jsx">...</script> //外部脚本_x000D_<script src="a.js" type="text/jsx"></script>
复制代码

引入JSX语法转换库

在html中使用JSX,还需要引入JSX语法转换库JSXTransform.js。 这个库加载后,将在DOM树构造完成后,通过监听DOMContentLoaded事件,处理 JSX脚本:

1. 搜索DOM树中的script节点,如果其类型为text/jsx则进行后续处理

2. 读取script节点的内容,将其转化为JavaScript代码

3. 构造一个新的script元素,设置其内容为转化结果代码,并追加到DOM树head元素中

JSXTransform.js引入后通过全局对象JSXTransformer提供了API接口, 我们可以使用transform()方法来模拟这个语法自劢转换的过程。


作者:zhulin1028

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
7月前
|
前端开发 JavaScript 算法
第一章 react简介
第一章 react简介
|
XML 移动开发 JavaScript
【React全家桶】react简介(一)
【React全家桶】react简介(一)
108 0
|
4月前
|
前端开发 JavaScript
React的生命周期简介(十)
【8月更文挑战第15天】React的生命周期简介
48 2
React的生命周期简介(十)
|
4月前
|
前端开发 JavaScript 中间件
React脚手架create-react-app简介
【8月更文挑战第13天】React脚手架create-react-app简介
244 4
|
4月前
|
前端开发 JavaScript Android开发
React Native 快速入门简直太棒啦!构建跨平台移动应用的捷径,带你开启高效开发之旅!
【8月更文挑战第31天】React Native凭借其跨平台特性、丰富的生态系统及优异性能,成为移动应用开发的热门选择。它允许使用JavaScript和React语法编写一次代码即可在iOS和Android上运行,显著提升开发效率。此外,基于React框架的组件化开发模式使得代码更加易于维护与复用,加之活跃的社区支持与第三方库资源,加速了应用开发流程。尽管作为跨平台框架,React Native在性能上却不输原生应用,支持原生代码优化以实现高效渲染与功能定制。对于开发者而言,React Native简化了移动应用开发流程,是快速构建高质量应用的理想之选。
86 0
|
4月前
|
前端开发 JavaScript 算法
React——React简介和基本使用【一】
React——React简介和基本使用【一】
41 0
|
6月前
|
移动开发 前端开发 Java
技术笔记:ReactNative学习笔记(一)————(RN)快速入门
技术笔记:ReactNative学习笔记(一)————(RN)快速入门
69 0
|
7月前
|
存储 JavaScript 前端开发
React中的Redux:简介和实例代码
React中的Redux:简介和实例代码
81 1
|
7月前
|
前端开发
React快速入门
React快速入门
34 0
|
7月前
|
前端开发 JavaScript
React 简介与环境搭建
【1月更文挑战第1天】React 简介与环境搭建
57 0