前端框架React Js入门教程【转】

2023-11-11

现在最热门的前端框架有AngularJS、React、Bootstrap等。自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领略
ReactJS的风采吧~~ 章有点长,耐心读完,你会有很大收获哦~

一、ReactJS简介

React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。

ReactJS官网地址:http://facebook.github.io/react/

Github地址:https://github.com/facebook/react

二、对ReactJS的认识及ReactJS的优点

首先,对于React,有一些认识误区,这里先总结一下:

  • React不是一个完整的MVC框架,最多可以认为是MVC中的V(View),甚至React并不非常认可MVC开发模式;

  • React的服务器端Render能力只能算是一个锦上添花的功能,并不是其核心出发点,事实上React官方站点几乎没有提及其在服务器端的应用;

  • 有人拿React和Web Component相提并论,但两者并不是完全的竞争关系,你完全可以用React去开发一个真正的Web Component;

  • React不是一个新的模板语言,JSX只是一个表象,没有JSX的React也能工作。

1、ReactJS的背景和原理

在Web开发中,我们总需要将变化的数据实时反应到UI上,这时就需要对DOM进行操作。而复杂或频繁的DOM操作通常是性能瓶颈产生的原因(如何进行高性能的复杂DOM操作通常是衡量一个前端开发人员技能的重要指标)。React为此引入了虚拟DOM(Virtual DOM)的机制:在浏览器端用Javascript实现了一套DOM API。基于React进行开发时所有的DOM构造都是通过虚拟DOM进行,每当数据变化时,React都会重新构建整个DOM树,然后React将当前整个DOM树和上一次的DOM树进行对比,得到DOM结构的区别,然后仅仅将需要变化的部分进行实际的浏览器DOM更新。而且React能够批处理虚拟DOM的刷新,在一个事件循环(Event Loop)内的两次数据变化会被合并,例如你连续的先将节点内容从A变成B,然后又从B变成A,React会认为UI不发生任何变化,而如果通过手动控制,这种逻辑通常是极其复杂的。尽管每一次都需要构造完整的虚拟DOM树,但是因为虚拟DOM是内存数据,性能是极高的,而对实际DOM进行操作的仅仅是Diff部分,因而能达到提高性能的目的。这样,在保证性能的同时,开发者将不再需要关注某个数据的变化如何更新到一个或多个具体的DOM元素,而只需要关心在任意一个数据状态下,整个界面是如何Render的。

如果你像在90年代那样写过服务器端Render的纯Web页面那么应该知道,服务器端所要做的就是根据数据Render出HTML送到浏览器端。如果这时因为用户的一个点击需要改变某个状态文字,那么也是通过刷新整个页面来完成的。服务器端并不需要知道是哪一小段HTML发生了变化,而只需要根据数据刷新整个页面。换句话说,任何UI的变化都是通过整体刷新来完成的。而React将这种开发模式以高性能的方式带到了前端,每做一点界面的更新,你都可以认为刷新了整个页面。至于如何进行局部更新以保证性能,则是React框架要完成的事情。

 

借用Facebook介绍React的视频中聊天应用的例子,当一条新的消息过来时,传统开发的思路如上图,你的开发过程需要知道哪条数据过来了,如何将新的DOM结点添加到当前DOM树上;而基于React的开发思路如下图,你永远只需要关心数据整体,两次数据之间的UI如何变化,则完全交给框架去做。可以看到,使用React大大降低了逻辑复杂性,意味着开发难度降低,可能产生Bug的机会也更少。

 

2、组件化

虚拟DOM(virtual-dom)不仅带来了简单的UI开发逻辑,同时也带来了组件化开发的思想,所谓组件,即封装起来的具有独立功能的UI部件。React推荐以组件的方式去重新思考UI构成,将UI上每一个功能相对独立的模块定义成组件,然后将小的组件通过组合或者嵌套的方式构成大的组件,最终完成整体UI的构建。例如,Facebook的instagram.com整站都采用了React来开发,整个页面就是一个大的组件,其中包含了嵌套的大量其它组件,大家有兴趣可以看下它背后的代码。

如果说MVC的思想让你做到视图-数据-控制器的分离,那么组件化的思考方式则是带来了UI功能模块之间的分离。我们通过一个典型的Blog评论界面来看MVC和组件化开发思路的区别。

对于MVC开发模式来说,开发者将三者定义成不同的类,实现了表现,数据,控制的分离。开发者更多的是从技术的角度来对UI进行拆分,实现松耦合。

对于React而言,则完全是一个新的思路,开发者从功能的角度出发,将UI分成不同的组件,每个组件都独立封装。

在React中,你按照界面模块自然划分的方式来组织和编写你的代码,对于评论界面而言,整个UI是一个通过小组件构成的大组件,每个组件只关心自己部分的逻辑,彼此独立。

072132381261891600.jpg

React认为一个组件应该具有如下特征:

(1)可组合(Composeable):一个组件易于和其它组件一起使用,或者嵌套在另一个组件内部。如果一个组件内部创建了另一个组件,那么说父组件拥有(own)它创建的子组件,通过这个特性,一个复杂的UI可以拆分成多个简单的UI组件;

(2)可重用(Reusable):每个组件都是具有独立功能的,它可以被使用在多个UI场景;

(3)可维护(Maintainable):每个小的组件仅仅包含自身的逻辑,更容易被理解和维护;

三、下载ReactJS,编写Hello,world

ReactJs下载非常简单,为了方便大家下载,这里再一次给出下载地址(链接),下载完成后,我么看到的是一个压缩包。解压后,我们新建一个html文件,引用react.js和JSXTransformer.js这两个js文件。html模板如下(js路径改成自己的):

QQ截图20150721110651.png

这里大家可能会奇怪,为什么script的type是text/jsx,这是因为 React 独有的 JSX 语法,跟 JavaScript 不兼容凡是使用 JSX 的地方,都要加上 type="text/jsx" 。 其次,React 提供两个库: react.js 和 JSXTransformer.js ,它们必须首先加载。其中,JSXTransformer.js 的作用是将 JSX 语法转为 JavaScript 语法。这一步很消耗时间,实际上线的时候,应该将它放到服务器完成。

到这里我们就可以开始编写代码了,首先我们先来认识一下ReactJs里面的React.render方法:

React.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。

下面我们在script标签里面编写代码,来输出Hello,world,代码如下:

QQ截图20150721111143.png

这里需要注意的是,react并不依赖jQuery,当然我们可以使用jQuery,但是render里面第二个参数必须使用JavaScript原生的getElementByID方法,不能使用jQuery来选取DOM节点。

然后,在浏览器打开这个页面,就可以看到浏览器显示一个大大的Hello,world,因为我们用了

标签。

 

到这里,恭喜,你已经步入了ReactJS的大门~~下面,让我们来进一步学习ReactJs吧~~

四、Jsx语法

HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的语法,它允许 HTML 与 JavaScript 的混写,了解过AngularJs的看到下面的代码一定会感觉很熟悉的,我们来看代码:

QQ截图20150721111531.png

这里我们声明了一个names数组,然后遍历在前面加上Hello,输出到DOM中,输出结果如下:

QQ截图20150721111639.png

JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员,代码如下:

QQ截图20150721111724.png

显示结果如下:

QQ截图20150721111738.png

这里的星号只是做标识用的,大家不要被迷惑了~~

你看到这里,说明你对React还是蛮感兴趣的,恭喜你,坚持下来了,那么下面,我们开始学习React里面的"真功夫"了~~ Are you ready?

五、ReactJS组件

1、组件属性

前面说了,ReactJS是基于组件化的开发,下面我们开始来学习ReactJS里面的组件,React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。React.createClass 方法就用于生成一个组件类。

下面,我们来编写第一个组件Greet,有一个name属性,然后输出hello + name的值,代码如下:

QQ截图20150721111858.png

看到这段代码,接触过AngularJS的朋友们是不是有一种熟悉的感觉,不过这里有几点需要注意:

1)获取属性的值用的是this.props.属性名

2)创建的组件名称首字母必须大写。

3)为元素添加css的class时,要用className。

4)组件的style属性的设置方式也值得注意,要写成style={{width: this.state.witdh}}。

2、组件状态

组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI 。下面我们来编写一个小例子,一个文本框和一个button,通过点击button可以改变文本框的编辑状态,禁止编辑和允许编辑。通过这个例子来理解ReactJS的状态机制。先看代码:

QQ截图20150721112014.png

这里,我们又使用到了一个方法getInitialState,这个函数在组件初始化的时候执行,必需返回NULL或者一个对象。这里我们可以通过this.state.属性名来访问属性值,这里我们将enable这个值跟input的disabled绑定,当要修改这个属性值时,要使用setState方法。我们声明handleClick方法,来绑定到button上面,实现改变state.enable的值。效果如下:

072305421429007.gif

原理分析:

当用户点击组件,导致状态变化,this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件。

这里值得注意的几点如下:

1)getInitialState函数必须有返回值,可以是NULL或者一个对象。

2)访问state的方法是this.state.属性名。

3)变量用{}包裹,不需要再加双引号。

3、组件的生命周期

组件的生命周期分成三个状态:

  • Mounting:已插入真实 DOM

  • Updating:正在被重新渲染

  • Unmounting:已移出真实 DOM

React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数。

  • componentWillMount()

  • componentDidMount()

  • componentWillUpdate(object nextProps, object nextState)

  • componentDidUpdate(object prevProps, object prevState)

  • componentWillUnmount()

此外,React 还提供两种特殊状态的处理函数。

  • componentWillReceiveProps(object nextProps):已加载组件收到新的参数时调用

  • shouldComponentUpdate(object nextProps, object nextState):组件判断是否重新渲染时调用

下面来看一个例子:

QQ截图20150721112254.png

上面代码在hello组件加载以后,通过 componentDidMount 方法设置一个定时器,每隔100毫秒,就重新设置组件的透明度,从而引发重新渲染。

4、组件的嵌套

React是基于组件化的开发,那么组件化开发最大的优点是什么?毫无疑问,当然是复用,下面我们来看看React中到底是如何实现组件的复用的,这里我们还写一个例子来说吧,代码如下:

QQ截图20150721112325.png

这里我们创建了一个Search组件,然后又创建了一个Page组件,然后我们在Page组件中调用Search组件,并且调用了两次,这里我们通过属性searchType传入值,最终显示结果如图:

六、ReactJS小结

关于ReactJS今天就先学习到这里了,下面来总结一下,主要有以下几点:

1、ReactJs是基于组件化的开发,所以最终你的页面应该是由若干个小组件组成的大组件。

2、可以通过属性,将值传递到组件内部,同理也可以通过属性将内部的结果传递到父级组件(留给大家研究);要对某些值的变化做DOM操作的,要把这些值放到state中。

3、为组件添加外部css样式时,类名应该写成className而不是class;添加内部样式时,应该是style={{opacity: this.state.opacity}}而不是style="opacity:{this.state.opacity};"。

4、组件名称首字母必须大写。

5、变量名用{}包裹,且不能加双引号。

七、参考资料

React中文文档 

React入门实例教程

颠覆式前端UI开发框架:React

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端框架React Js入门教程【转】 的相关文章

  • Chrome:网络元素自动移动

    我正在开发一个网络项目 在过去的两周里 我正在进行学期考试 所以我要休息一下 现在 既然他们已经结束了 我又继续我的工作了 但我发现我的一些Web 元素 如按钮 span 在 Chrome 上移动了一些像素 在 IE 和 Mozilla 上
  • 发送变量后的 wsdl 服务响应,php

    我是 SOAP WSDL 函数的新手 我有一位客户从一家从事汽车测试的公司获得了 wsdl 文件 我的客户是他们的分包商 他们告诉我们上传有关车牌 类别等信息 一旦详细信息发送完毕 服务器就会做出成功或失败的响应 请您协助 浏览不同的信息
  • 尝试使用 php 发送 POST 请求,无论我做什么,我都会收到“HTTP ERROR 500”

    为了发出 HTTP 请求 有人建议我尝试使用 PHP 并给了我一段代码 url https example com dashboard api data array to gt PHONE NUMBER from gt SENDER ID
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • VBA - 如何从网站下载.xls并将数据放入Excel文件

    我设法使用 VBA 达到准备从网络下载 Excel 文件的程度 但我无法弄清楚如何实际下载该文件并将其内容放入我正在使用的 Excel 文件中 有什么建议么 谢谢 这是到目前为止的代码 Sub GetData Dim IE As Inter
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • 如何从我的网站发送电子邮件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在一个网站上工作 我是这个领域的新手 我已经制作了一个网站 但我在 联系我们 表单中遇到了问题 在这种形式中 我制作了四个文本框
  • Tomcat:源服务器没有找到目标资源的当前表示,或者不愿意透露该表示的存在[重复]

    这个问题在这里已经有答案了 我知道以前有类似的问题 但我仍然找不到正确的解决方案 我得到 源服务器没有找到目标资源的当前表示 或者不愿意透露该表示的存在 我正在使用 Tomcat 服务器 有人可以帮助我吗 以下是我的项目结构 我被这个问题困
  • Tornado websocket handler , self.close() 正在关闭连接而不触发 on_close() 方法

    我是 python stackoverflow tornado 的新手 所以请耐心等待 纠正我 我正在使用龙卷风开发实时应用程序 当我在 Websocket 处理程序类中调用 self close 时 on close 方法不会启动 这次我
  • Bootstrap - 为反向行模式创建移动自适应

    我想用 Bootstrap 创建一个反向效果 第一行 左边是文字 右边是图像 第二行 左边是图片 右边是文字 第三行 左边是文字 右边是图片 第四行 左边是图片 右边是文字 而且这种情况一直持续下去 它在大型设备上看起来非常漂亮 但当它在设
  • 如何在 PHP Soap 客户端中禁用命名空间别名?

    我的 PHP Microsoft AX 集成有问题 我正在使用 SOAP WSDL 与服务集成 我遇到的问题是在从 PHP 向 WSDL 发送请求后收到此错误 无效的实例类型名称 ns3 AxdEntity DirParty DirOrga
  • 向下滚动时如何使图像移动?

    这是我想要实现的目标的示例 https www flambette com en https www flambette com en 我尝试过更改图像的 css 属性 但效果不能满足我的需求 我尝试过以下代码 mydocument on
  • Android - Java - 发送 facebook 聊天消息的意图(facebook 禁用 xmpp)

    Facebook 已弃用 xmpp API 有没有办法打开意图 或将数据传递到fb 以在Android设备上发送聊天消息 设备上安装的 Facebook 和 Messenger 应用 谢谢 您需要将 uri 传递给意图 这里10000572
  • 如何修复/解决 java.lang.reflect.InitationTargetException

    我有一个关于一个特别烦人的错误的问题 我一直无法弄清楚 更不用说克服了 每当我尝试在网站上运行 Java 小程序 Applet 或 JApplet 时 都会弹出此错误 java lang reflect InvocationTargetEx
  • 如果谷歌的主页如此之小,为什么源代码只有数百行代码? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 代码被缩小了 但重新格式化后只有几百行代码 我想象这样一个最小的页面也有最少的代码 源代码这么长 Google 到底在做什么 我可以看到很多都是
  • 如何使我的网站兼容移动设备和平板电脑? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想让我现有的网站在手机 平板电脑上查看时自动调整 甚至在您在桌面上调整屏幕时自动调整 如果失败的话 如果太难 你有什么建议 我基本上
  • 遭受xss攻击后如何恢复站点?

    最近我正在研究XSS攻击以及它们对网站的破坏性有多大 让我惊讶的是 网络 even SO 充满了关于如何防止xss攻击但没有相关资源说明如何在网站受到 xss 攻击后恢复网站 我遇到过一些事情 比如 将备份网站代码上传回服务器 下载整个网站
  • 在网站的一次导航中仅显示一次弹出窗口

    我有一个使用 Laravel 创建的网站 我希望用户第一次访问我的网站时能够看到弹出窗口 我的意思是第一次 用户访问我网站上的任何页面 这是第一次 访问网站上的一些链接页面 现在 这些页面访问不是第一次 在同一选项卡中打开 facebook
  • 可靠的在线手册复制工具

    我经常需要在没有互联网的情况下开发项目 不幸的是 越来越多的程序不再有离线手册 在本地复制在线帮助的最佳方法是什么 HTTrack 网站复制器经常失败 哪个 Windows 工具最可靠 感谢你的建议 如果您有使用 HTTrack Websi
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个

随机推荐

  • 鹅厂内部干货

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 作者介绍 陈阳 Younger 2011年加入腾讯 现就职于腾讯游戏增值服务部 负责AMS游戏营销平台 致力于研究和推动Web及大前端相关技术的发展 一 微信小游戏 H5小游戏及微信
  • “1448万,一条命”:在生命面前,金钱显得太刺眼

    1 前段时间 美国上市了一种治疗小儿脊髓性肌肉萎缩的药 引起了非常激烈的讨论 为什么会有这么大的争议呢 因为这种药特别贵 标价210万美元 人民币约1448万元 仅仅一支药 就相当于北京三环一套房 小儿脊髓性肌肉萎缩这个病到底有多恐怖呢 得
  • 利用bat,vb实现根据日期自动备份文件

    假如D backup a为备份源文件夹 备份路径为D backup 文件夹名为当天的日期 如D backup 2006 04 17 a 每周5备份一次 3周一个循环 即备份第4周时 第1周的备份删除 以减少空间 同时在D backup lo
  • 基于单片机的电子万年历设计与制作系统(设计报告+开题中期报告+仿真文件+程序)

    摘要 本文设计实现了一种基于单片机的电子万年历设计与制作系统 该系统通过单片机的控制 实现了日期 时间和节假日等信息的显示 同时提供了闹钟 定时器和温度显示等功能 实验结果表明 该系统具有较好的稳定性和实用性 能够满足人们对万年历功能的需求
  • kotlin语法总结(一)

    下一章地址 kotlin语法总结 二 文章目录 前言 前言 接下来几章将总结一下kotlin的语法 总结kotlin和java不一样的地方 1 var可修改 val只读 类型推断 const val a 1 编译时常量 2 kotlin只提
  • 假设检验之参数

    假设检验 p值的判断使用 很强很有用
  • Pytorch调用GPU的方法

    Pytorch调用GPU有两种方法 一种是torch cuda 一种是torch to torch cuda 通常会在配置文件中写入调用的GPU 默认不填参数为0 gpu 0 1 2 默认调用调用0号GPU network network
  • UVM 寄存器内建测试序列(built-in sequences)

    原文链接 https blog csdn net qq 42419590 article details 121487295 UVM 寄存器内建测试序列 built in sequences 不少有经验的UVM用户可能会忽略UVM针对寄存器
  • 电子设计大赛作品_竞赛来袭

    2020电子设计大赛 一年一度的电子设计大赛要来啦 想不想与同学好友一起打电赛 结识众多大佬 掌握各种专业知识 做出属于自己的作品 手捧奖状 让自己的大学简历更有含金量呢 那就和小电一起来看看吧 一 竞赛简介 全国大学生电子设计竞赛 以下简
  • HTMLTestRunner 加强版 HwTestReport 加入样式美化、中英文版本、Selenium和Appium截图、饼图等内容

    本项目源码已经进入Github的北极代码仓库 Arctic Code Vault 据说这些Bug Code 要冰封1000年 作为 HwTTK Test Tool Kit 中的一员 HwTestReport具有以下特性 支持Python2和
  • pycharm+python3.8安装opencv+contrib

    A opencv python与opencv contrib python的区别 1 opencv python包含opencv的主模块 下载地址 https pypi org project opencv python files 2 o
  • 评测指标(metrics)

    评测指标 metrics metric主要用来评测机器学习模型的好坏程度 不同的任务应该选择不同的评价指标 分类 回归和排序问题应该选择不同的评价函数 不同的问题应该不同对待 即使都是 分类问题也不应该唯评价函数论 不同问题不同分析 回归
  • Gin中的Cookie和Session的用法

    Gin中的Cookie和Session的用法 文章目录 Gin中的Cookie和Session的用法 介绍 Cookie 代码演示 Session 代码展示 介绍 cookie 和 session 是 Web 开发中常用的两种技术 主要用于
  • 【Logback】<appender>标签详解

    文章目录 一 Appender是什么 1 1 Appender定义 1 2 Appender类图说明 二 Appender概述 三 ConsoleAppender使用 四 FileAppender使用 4 1 FileAppender使用
  • 2024年王道数据结构【考研全套笔记】

    22年 23年数据结构大纲一致 24年大纲 gt 目前和23年大纲保持一致 该博客怎么食用 大部分考408的友友 只是买了书 书上配置的免费视频是滞后2年的 非常不友好 建议在某鱼上or大学慕课正规购买 还是最新的视频香 看完视频必须做笔记
  • 深入学习java源码之Byte.decode()与Byte.toUnsignedInt()

    深入学习java源码之Byte decode 与Byte toUnsignedInt 异常 异常就是有异于常态 和正常情况不一样 有错误出错 在java中 阻止当前方法或作用域的情况 称之为异常 其中Error类中包括虚拟机错误和线程死锁
  • SpringBoot本地磁盘映射

    出于安全性考虑 SpringBoot无法直接访问本地磁盘的文件 在某些应用场景下 需要访问例如本地的图片等一些内容 这时候 我们可以通过创建一个虚拟路径来指向本地磁盘文件 重写WEB配置类 添加新的静态资源路径配置 代码如下 Configu
  • 力扣(LeetCode)给定一个非负整数数组,你最初位于数组的第一个位置。

    力扣 LeetCode 给定一个非负整数数组 你最初位于数组的第一个位置 给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个位置 示例 1 输入 2 3 1 1 4
  • 数据仓库主题十-(周期快照事实表)

    综述 当我们在实际工作过程中涉及到一些指标的计算比如账户余额 买卖家星级 商品库存 卖家累积交易额等计算中 则需要聚集与之相关的事务才能进行识别计 或者聚集事务无法识别 比如 温度等 对于这些状态度量 事务事实表是无效率的 而这些度量也和度
  • 前端框架React Js入门教程【转】

    现在最热门的前端框架有AngularJS React Bootstrap等 自从接触了ReactJS ReactJs的虚拟DOM Virtual DOM 和组件化的开发深深的吸引了我 下面来跟我一起领略 ReactJS的风采吧 章有点长 耐