1. React简介和特点
1.基本概念
React 是一个用于构建用户界面的 JAVASCRIPT 库。
React 主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图)。
React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。
React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。
2.react和vue有什么区别?*
*框架本质*
- vue - 本质是 MVVM 框架,由 MVC 发展而来
- React - 本质是前端组件化框架,不是一个完整的MVC框架,可以认为是MVC中的V(View)
*声明周期*
- 声明周期不一样,React为每个组件提供了生命周期钩子函数去响应不同的时刻,组件
的生命周期分为三个部分:(1)实例化;(2)存在期;(3)销毁&清理期。
*数据流管理*
- 数据流管理 ,Vue的思想是响应式,给每个属性设置watcher监听属性改变,更新虚拟DOM,从而更新视图
- React是单向数据流,数据由容器组件(负责业务逻辑)向展示组件(负责UI管理)传递,
通常我们会将展示组件抽出来进行复用或者组件库的封装,
容器组件自身通过state来管理状态,setState更新状态,从而更新UI,通过props将
自身的state传递给展示组件实现通信
*模版不同*
- vue使用模版 模版分离了
- React使用jsx 使用原生的js代码,解析就会更高效,但是的话就是模版和js混合了,没有分离
*组件化*
- React本身就是组件化
- Vue也支持组件化,但是只在MVVM上扩展出来的,没有那么纯粹
3.react 有什么特点?
声明式设计 −React采用声明范式,可以轻松描述应用
高效 React通过对DOM的模拟,最大限度地减少与DOM的交互
灵活 React可以与已知的库或框架很好地配合
JSX JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。
组件 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中
单向响应数据流 React
实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单
2.react中虚拟DOM和Diff算法
**虚拟DOM**
React的一个突出特点是拥有极速地渲染性能。该功能依靠的就是facebook研发团队弄出的虚拟dom
机制以及其独特的diff算法。
React中,先将真实的DOM抽象成一个JavaScript对象,也就是虚拟DOM;
- 标准dom机制下,用户在应用上的操作是直接对真实dom进行操作的,
- 而在react应用中,有一个render函数来虚拟DOM树,用户在应用中对dom的操作其实是对虚拟dom
的操作,用户的操作产生的数据改变或者state变量改变,就会触发render函数,重新构造一个虚拟DOM树,
之后再批量的对这些更改进行diff算法计算,对比操作前后的虚拟dom树,把更改后的变化再同步到真实dom上。
<img src="https://segmentfault.com/img/bVSLNQ?w=639&h=103"/>
<img src="https://segmentfault.com/img/bVSLOg?w=392&h=95"/>
标准dom机制下对某一节点在事件函数中做如下操作:
```javascript
var A=document.getElementById('test');
A.style.backgroundColor = "black";
A.style.backgroundColor = "red";
A.style.backgroundColor = "black";
```
如上所示,在标准dom机制下,会对A节点进行三次的dom操作。
而在react应用的事件函数中进行如上操作时,同样会在虚拟dom上进行三次dom的操作,但在
真实dom中,它只会执行一次dom操作,
因为在react虚拟dom机制中,它会把所有的操作都会合并,只会对比刚开始的状态和最后操作
的状态,两者中找出不同再同步到真实dom中,这就大大减少了真实dom的操作,而众所周知,
dom操作是很耗性能的,这是react能做到极速渲染的原因之一。
**Diff算法**
`如何进行新旧虚拟DOM树的对比呢?`
这里采用的是Diff算法。Diff算法比较复杂,主要的思路是这样的。
首先,每一次生成的虚拟DOM树上的各个节点都对应唯一的一个id,当第二次生成了新的DOM树时,对原来树上的每一个节点对比新树上对应节点,如果不同,就记录下来这个差异。
替换节点; 修改属性;对文本内容修改;移动、删除、增加节点;
**步骤**
- js对象模拟DOM树
- 比较新旧虚拟DOM树的差异
- 找出差异,更新作用到真实的DOM树上
比如,替换节点就需要调原生JS的repaceChild()接口;对于修改属性,则要调setAttribute()接
口等等。
<img src="https://segmentfault.com/img/bVSLSc?w=576&h=318">
在标准dom机制下:在同一位置对比前后的dom节点,发现节点改变了,会继续比较该节点的子节点
,一层层对比,找到不同的节点,然后更新节点。
在react的diff算法下,在同一位置对比前后dom节点,只要发现不同,就会删除操作前的domm节点
(包括其子节点),替换为操作后的dom节点。
对比两种diff算法,大家可以发现,react的diff算法下,当dom节点更改时,会大大减少dom树的节
点遍历,这也是其另外一个可以实现极速渲染的一个原因。
3.react脚手架的安装
- 第一种方式应用CDN的地址
```HTML
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
```
- 安装脚手架
```js
$ cnpm install -g create-react-app
$ npx create-react-app my-app
$ cd my-app/
$ npm start
```
**问题?create-react-app 执行慢的解决方法**
```js
执行完 `npm config get registry`
如果结果为
`http://registry.npmjs.org/`
重新修改一下配置
npm config set registry https://registry.npm.taobao.org
-- 配置后可通过下面方式来验证是否成功
npm config get registry
--或者--
npm info express
```