初识React

React优势

  1. 组件化开发 社区活跃 提交代码可复用性 维护性
  2. 虚拟DOM(diff 算法) 提高页面渲染速度
  3. 生命周期 对数据的控制 使开发者更专注业务开发
  4. 单向数据流

总结:

React是一个前端框架 使前端开发更细致化
1.路由层Route
程序跑起来 首先寻找路由组件 根据路由组件找到对应的页面组件 页面组件找到对应的UI组件 最后进行渲染
2.数据层state
3.虚拟dom 减少dom的操作
让代码更具有维护性 而且国内antd 让开发后台管理系统变得更加容易

组件化开发

路由组件 页面组件 UI组件 提交代码维护性 以及可读性

生命周期

这里写图片描述

单向数据流

数据的流向是单向的——从父节点传递到子节点,因为组件是简单而且易于把握的,他们只需从父节点获取props渲染即可,如果顶层组件的某个prop改变了,React会递归的向下遍历整棵组件树,重新渲染所有使用这个属性的组件。

React中Virtual-DOM原理 diff算法

第一次渲染页面 同时保存一份当前Dom-Tree的虚拟DOM 然后第二次渲染时 对比虚拟DOM 只渲染改变的DOM结构
更多对Virtual-DOM介绍访问https://www.zhihu.com/question/29504639/answer/73607810
真实DOM属性
这里写图片描述

真实DOM是很慢的。如果我们把一个简单的div元素的属性都打印出来,你会看到:
而这仅仅是第一层。真正的 DOM 元素非常庞大,这是因为标准就是这么设计的。而且操作它们的时候你要小心翼翼,轻微的触碰可能就会导致页面重排,这可是杀死性能的罪魁祸首。


虚拟DOM类似以下结构:
相对于 DOM 对象,原生的 JavaScript 对象处理起来更快,而且更简单。DOM 树上的结构、属性信息我们都可以很容易地用 JavaScript 对象表示出来:

var element = {
  tagName: 'ul', // 节点标签名
  props: { // DOM的属性,用一个对象存储键值对
    id: 'list'
  },
  children: [ // 该节点的子节点
    {tagName: 'li', props: {class: 'item'}, children: ["Item 1"]},
    {tagName: 'li', props: {class: 'item'}, children: ["Item 2"]},
    {tagName: 'li', props: {class: 'item'}, children: ["Item 3"]},
  ]
}

然后虚拟DOM进行对比 在没有进行render()之前 合并对比所有DOM的最小操作 最后渲染真实的DOM 最小的操作真实的DOM 因为相对来说直接操作真实的DOM成本很高
还有一个问题
react 在每个组件内部有一个私有的state状态机的东西 专门负责管理数据 这样数据和UI就解耦了 不像以前更新了DOM可能就混乱 难以管理
最终解决的就是维护状态,更新视图

比较易懂的例子

比如说,现在你的list是这样,

<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>

你想把它变成这样

<ul>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
传统的方式: 移除4个li元素 重新添加5个li元素 一共操作了9次dom
然而react 
1.首先对应的虚拟Dom中对应的每个li元素生成了一个唯一的id 
2.在diff对比虚拟dom  发现前4个li元素的DOM结构并没有变化 变化的只是里面的内容 
然后新增一个"<li>10</li>"元素 一共五次操作

对比
传统的方式中 
一共操作了9次DOM 这9次DOM包括了对DOM结构的操作(ps:移除 新增) 
以及DOM里面的内容的操作

而React中
只有一次是对DOM结构和DOM里内容的操作 然而其他4次都是对Dom里的内容进行的操作

这样一对比 
React操作DOM的次数最少 并且React每次都是最小单元的最最最细致的在操作和管理DOM的结构
真的强大
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章