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的另一个好处是,容易引入不同的渲染引擎。比如将你的应用代码渲染 到真实的DOM,或者nodejs服务端的无头DOM,或者,iOS/Android平台组件 —— 这就是 React Native :

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(
    "ul",
    null,
    React.createElement("li",null,"China"),
    React.createElement("li",null,"Japan"),
    React.createElement("li",null,"Korea")
);

上面的例子在虚拟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应用和手机端应用:

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

相当棒的思路!

React组件

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

React.createClass(meta)

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

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

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

render:function(){
    return React.createElement(
        "div",null,
        React.createElement("div",null,"header"),
        React.createElement("div",null,"content"),
        React.createElement("div",null,"footer")
    );
}

注意 :你的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(){
    return React.createElement(
        "div",null,
        React.createElement("div",{className:"ez-led"},"Hello, React!"),
        React.createElement("div",{className:"ez-led"},"2015-04-15")
    );
}

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

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

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

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

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

//JavaScript
var e = React.createElement(
        "ul",null,
        React.createElement("li",null,"China"),
        React.createElement("li",null,"Japan"),
    );
//JSX = JavaScript + XML like extension
var e = 

*   China
*   Japan;

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

使用JSX

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

指定脚本类型

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

//内联脚本
<script type="text/jsx">...</script>
//外部脚本
<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()方法来模拟这个语法自动转换的过程。

在右边的示例代码中,为了避免自动转换,我们将script元素的类型设置为text/jsx2, 同时为了简化DOM元素定位,给它加了一个id。

点击按钮,你就可以看到转换结果。查看代码,理解自动转换的步骤。

更多的内容和免费的配套在线练习可以看这儿!

时间: 2024-11-05 18:31:44

react 最近很火,翻出一篇旧文,和大家分享一下。的相关文章

一篇旧文《别把孩子太当回事》

我说别把孩子太当回事,可能会有很多家长跳出来跟我理论.现在家里面只有一个孩子,往往都是家庭的重心.我的观点是父母和孩子都是家庭中的一份子,地位应该是平等的,家长有自己的事情做,孩子也有一些事情家长插不上手,比如说孩子在玩玩具的时候,自己念念有词,大人很难进入他的世界.另外,如果把孩子当作你的全部,花费了大量的时间精力在上面,无形中会给孩子增加很多压力,这一点我会在文末再做论述.但孩子不可能永远在你身边,一旦长大了他总要飞走,如果你太把孩子当回事的话,将来的心理失衡会让你好像整个世界都颠覆了一样—

如何写好一篇软文?

大部分做SEO的站长不知道如何去写一篇高质量的软文,即使技术非常好也不知道怎么表达出来.其实写软文很简单,学习写好软文能让你的优化做的更加容易. 1.标题选择 如果你的软文适用于网站的推广,不管是引导用户还是网站品牌的推广那么都需要考虑用户的定位.因为在这个行业永远是初级用户看文章的比较多,而有一定经验的SEOer很少去看论坛帖子文章.所以我们的设置标题的时候一定要抓住初级用户,标题一定要是基础的内容,涉及到高深的技术初级用户很难懂,自然也不会去点击了.怎么去设置呢?标题一定要懂得选择关键词,通

如何拿出一篇精致的“摹仿”之作

与其说,本文讲如何写论文,不如说是教你们如何拿出一篇精致的“摹仿”之作. 摹仿不是抄袭,也不是效仿——如今是全民造假的时代,但低劣的抄袭仍会遭到封杀.而能运用摹仿的人,才是赢家.你必须清楚,你我生来就不是搞学术的料. 拜托,不要做书呆子. 写论文最快的方法就是抄袭,但抄袭检测机器淘汰掉了我们当中的蠢才.本篇文章就从这里出发,讨论如何写好论文.如果你经不起诱惑,建议你还是退学创业. 一.思维 什么是论文写作思维? 宽泛说,任何一种写作都需要冷静的头脑.像李白那样饮酒作诗太罕见,大多数人都需要反复推

翻出当年的学习进度汇报邮件——前路不易,且行且珍惜

离回归程序猿行列已经一年又一个月整了,也就是进入现在这家公司已经一年又一个月整.确实是个整数,清清楚楚的记得去年入职时间是3月27日,似乎冥冥中总有那么些凑巧的事情发生.现在的公司是一家创业型公司,接受过一轮风投,从创办至今,时间其实不算短.今年是公司非常关键的一年,总觉得年初至今的项目目标不够明确,甚至有点杂乱.作为一个开发人员兼中层管理,最近这段时间想的比较多.可能由于上个月拼死拼活做的项目因为找不到盈利模式被迫暂停的缘故,最近几个星期尤为浮躁,很难静下心来看书学习. 今天下午一时兴起开始整

一款当前很火的抢票神器的重大bug

一款当前很火的抢票神器的重大bug by Idouba on 2014年12月23日 in dou&life, douba, doudou, douma 前言:昨天在家抢票,无意中发现了最近很火的一款猎豹抢票神器的重大bug.简单描述下,并加上自己对bug原因的定位和分析,希望可以帮助这款神器的使用者和开发者提供些有用信息. 快过年了,又到了一年抢票时.今年douba和douma计划要带着doudou回姥姥家.昨天在家用抢票软件居然发现了一个bug,按照douma的指示,今天上班来中午吃完饭不休

[转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法

[From] https://www.zmrbk.com/post-2030.html https://blog.csdn.net/suifengshiyu/article/details/40952771 我的理解是,如果出现如题所描述的问题,这是因为使用了不同的shell程序和对应的stty设置对应关系所综合作用的结果. 这是/bin/sh里面stty -a命令输出的信息: $ stty -a speed 38400 baud; rows 43; columns 209; line = 0;

草根自媒体很难再出“达人”嘛?冯东阳+4个月+草根=月收过万+粉丝总浏览突破“百万”…………

草根在十年前就被网络提起,最近两年很是流行.自己也做自媒体有些年月了,深深感触草根很难再出达人.自媒体达人三要素=原创+坚持+分享 达人都是逆袭成功的.你想成功,你想成为达人,可是你的行动呢?坚持呢?分享的精神呢?前几天北京游玩,也认识了一位数据SEO的牛人,他姓胡“自称胡歌”,哈~ 他是一个对数据来源很敏感的人,哪怕是跟他面对面的交流时.你可能会问,他丫的有病吧.No……No,恰恰相反,胡哥的智商挺高的,智商简直超群.在这里倒不是说胡哥有多么的牛叉,是说他那一种令人难以置信,甚至不可理喻的专注

安利一个很火的 Github 滤镜项目

安利一个很火的 Github 滤镜项目 园长 1 个月前 简评:通过深度学习,一秒钟让你的照片高大上,这是康奈尔大学和 Adobe 的工程师合作的一个新项目,通过卷积神经网络把图片进行风格迁移.项目已开源,名字叫「Deep Photo Style Transfer」,有兴趣的玩家请移步 Github. 照片风格迁移的项目非常多,比如之前迁移名画的作品(GitHub 地址). (第一张图片是参照,第二张是原图,第三章图片是迁移后)或者各种风格化的项目(7 个 App 可让你的照片变成艺术品). 近

html5很火,他到底与html4有何区别?

HTML5是HTML标准的下一个版本.越来越多的程序员开始HTML5来构建网站.如果你同时使用HTML4和HTML5的话 ,你会发现用HTML5从头构建,比从HTML4迁移到HTML5要方便很多.虽然HTML5没有完全颠覆HTML4,它们还是有很多相似之处,但是它们 也有一些关键的不同.本文就列出了它们之间10个关键的不同之处. 1. HTML5 标准还在制定中 首先要注意的是,HTML5虽然现在很火,但是HTML5标准还在制定中,标准仍在改变.HTML4已经10多年了,不会有任何改变了. 2.