底层的理论基础

一. 原始生成步骤

1.state 数据

2.jsx 模版

3.数据 + 模板 结合,生成真实的DOM,来显示

4.state 发生改变了

5.数据 + 模板 结合,生成真实的DOM,替换原来的DOM

缺陷:

第一次生成一个完整的DOM片段

第二次有生成了一个完整的DOM片段

第二次的DOM替换第一次的DOM,非常消耗性能

二.  逐步改进

1.state 数据

2.jsx 模版

3.数据 + 模板 结合,生成真实的DOM,来显示

4.state 发生改变了

5.数据 + 模板 结合,生成真实的DOM,并不直接替换原始的DOM

6.新的DOM (DocumnetFragment )和原始的DOM做对比,找差异

7.找出input框发生了变化

8.只用新的DOM中的input元素,替换掉老的DOM中的input元素

缺陷:

性能的提升不明显

三.  react 虚拟DOM

1.state 数据

2.jsx 模版

3.数据 + 模板 结合,生成真实的DOM,来显示

<div id="abc"><span>hello world !</span></div>

4.生成虚拟DOM(虚拟DOM就是一个js 对象,用它来描述真实DOM)(损耗性能)

['DIV',{ id : 'abc'},['span',{},'bye bye']]

5.state 发生变化

6..数据 + 模板 生成新的虚拟DOM(极大的提升了性能)

['DIV',{ id : 'abc'},['span',{},'bye bye']]

7.比较原始虚拟DOM和新的虚拟DOM的区别,找到区别是span的内容 (极大的提升了性能)

8.直接操作DOM,改变span中的内容

React中虚拟DOM的概念:

虚拟DOM本质上就是一个JS对象,之所以能够提高性能,本质上是因为js去比较js对象不太消耗性能,而去比较真实的DOM会很消耗性能。

四. 深入了解虚拟DOM

实际实现:

1.state 数据

2.JSX 模版  JSX->creatElement ->虚拟DOM(JS对象)->真实DOM

3. 数据 + 模板 生成虚拟DOM(虚拟DOM就是一个js 对象,用它来描述真实DOM)(损耗性能)

['DIV',{ id : 'abc'},['span',{},'bye bye']]

4.  用虚拟DOM的结构结生成真实的DOM,来显示

<div id="abc"><span>hello world !</span></div>

5. state  发生变化

6. 数据 + 模板 生成新的虚拟DOM(极大的提升了性能)

['DIV',{ id : 'abc'},['span',{},'bye bye']]

7.比较原始虚拟DOM和新的虚拟DOM的区别,找到区别是span的内容 (极大的提升了性能)

8.直接操作DOM,改变span中的内容

优点:

1.性能提升了

2.它使得跨端应用得以实现。React Native

渲染DOM在浏览器上是没有什么问题的,可是在移动端的原生应用里面,我们开发的安卓,iOS机器代码当中里面是不存在DOM的概念的,所以在原生的应用里没有办法生成DOM,也无法被使用,但是有了虚拟DOM就不一样了,我们的代码首先会被转化成一个虚拟DOM,然后它是个js对象,它放在浏览器里可以被识别,同时,它在原生的应用里面也可以被识别,所以这个虚拟DOM不管是在原生应用里面还是在网页应用里面都可以被正确的识别。

五.  虚拟DOM中的Diff算法

1.state 数据

2.JSX 模版

3. 数据 + 模板 生成虚拟DOM(虚拟DOM就是一个js 对象,用它来描述真实DOM)(损耗性能)

['DIV',{ id : 'abc'},['span',{},'bye bye']]

4.  用虚拟DOM的结构结生成真实的DOM,来显示

<div id="abc"><span>hello world !</span></div>

5. state  发生变化

6. 数据 + 模板 生成新的虚拟DOM(极大的提升了性能)

['DIV',{ id : 'abc'},['span',{},'bye bye']]

7.比较原始虚拟DOM和新的虚拟DOM的区别,找到区别是span的内容 (极大的提升了性能)

diff算法(diffrence)

同层比对,

能不用index做key值就不用index做key值。

8.直接操作DOM,改变span中的内容

最新文章

  1. 【Android Studio】android Internal HTTP server disabled 解决
  2. 技术英文单词贴--M
  3. jQuery ajax()使用serialize()提交form数据
  4. Selenium自动化测试实践 公开班(广州)
  5. c++ 在客户端的GCC使用
  6. WPF 之 后台设置Image的Souce
  7. 04747_Java语言程序设计(一)_第5章_图形界面设计(一)
  8. 通过layer-list多图层叠加效果实现圆角功能
  9. 程序设计实践C++ 程序代写(QQ 928900200)
  10. AngularJS之使用服务封装
  11. bootstrap模态框远程加载网页的正确处理方式
  12. noip普及组2005 采药
  13. 报表生成工具 —— iText
  14. 【JS】VUE学习
  15. CentOS7.5实践快速部署LAMP+Tomcat成功运行阿里云或者腾讯云
  16. 在MacOS上使用gdb(cgdb)调试Golang程序
  17. pyqt5在xp下的配置
  18. Spark 的 Shuffle过程介绍`
  19. 20145226 《Java程序设计》第七周学习总结
  20. 让nginx支持HLS

热门文章

  1. jackson 进行json与java对象转换 之一
  2. 11-24网页基础--Js框架及学习思路
  3. 问题:Server.MapPath;结果:Server.MapPath的命名空间
  4. 浅谈Android四大组建之一Service---Service的创建
  5. WPF TextBox 一些设置技巧
  6. python爬虫实战(1)--爬取糗事百科
  7. js闭包(二)
  8. php返回文件路径
  9. Python02 标准输入输出、数据类型、变量、随记数的生成、turtle模块详解
  10. iOS 聊天界面