React中的虚拟DOM

摘要:
当状态更改时,呈现函数将重新呈现页面。JSX代码与真实DOM之间的关系:首先,将JSX代码转换为JS对象,然后将其转换为真实DOM。虚拟DOM的优点:1。提高性能2。实现跨端应用。

我们知道,当组件的state和props发生变化的时候,render函数就会重新执行,组件就会被重新渲染,这样是性能非常低的。因此,react引入了虚拟DOM.

虚拟DOM是什么呢?虚拟DOM就是一个JS对象,用它来描述真实DOM。

当state发生变化时,render函数会重新执行渲染页面。如果我们自己来做这个功能,那该怎样实现呢?

方案一:
1. 定义一个state,先有数据
2. 有一个模板(render函数中jsx的代码)
3. 数据与模板相结合,生成真实的DOM来显示
4. state发生改变
5. 数据与模板结合,生成真实DOM,替换原始的DOM

缺陷:
第一次生成了完整的DOM片段
第二次生成了完整的DOM片段
第二次的DOM替换第一次的DOM,非常耗性能

有时候我们只是改了页面上一小部分数据,这种方案下,却要替换整个DOM,性能很低。

方案二:
1. 定义一个state,先有数据
2. 有一个模板(render函数中jsx的代码)
3. 数据与模板相结合,生成真实的DOM来显示
4. state发生改变
5. 数据与模板结合,生成真实DOM,并不直接替换原始的DOM
6. 新的DOM(也就是DocumentFragment)和原始的DOM作比对,找差异
7. 找出input框发生了变化
8. 只用新的DOM中的input元素,替换掉旧的DOM中的input元素

缺陷:
虽然只替换发生了变化的input元素,提升了性能,但是在新旧DOM比对过程中也消耗了性能,因此性能提升的并不明显
方案三:
1. 定义一个state,先有数据
2. 有一个模板(render函数中jsx的代码)
3. 数据与模板相结合,生成真实的DOM来显示
例如真实的DOM:<div id='abc'><span>hello~</span></div>
4. 生成虚拟DOM
虚拟DOM:['div', {id:'abc'}, ['span', {}, 'hello~']]
5. state发生变化
6. 生成新的虚拟DOM
虚拟DOM:['div', {id:'abc'}, ['span', {}, 'bye~']]
7. 比较原始虚拟DOM和新的虚拟DOM的区别,找到区别是span中的内容
8. 直接操作DOM,改变span中的内容

减少了真实DOM的创建以及对比,我们创建和对比的都是JS对象,这样提升了极大的性能。

实际上,react底层真正的实现:

1. 定义一个state,先有数据

2. 有一个模板(render函数中jsx的代码)

3. 生成虚拟DOM
虚拟DOM:['div', {id:'abc'}, ['span', {}, 'hello~']]

4. 用虚拟DOM的结构生成真实的DOM来显示
真实的DOM:<div id='abc'><span>hello~</span></div>

5. state发生变化

6. 生成新的虚拟DOM
虚拟DOM:['div', {id:'abc'}, ['span', {}, 'bye~']]

7. 比较原始虚拟DOM和新的虚拟DOM的区别,找到区别是span中的内容

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

当有了数据、JSX模板之后,react会先生成虚拟DOM,后依据虚拟DOM生成真实DOM。
JSX代码与真实的DOM之间的关系:先将JSX代码变成JS对象(react底层把JSX代码通过creatElement方法将其变成JS对象),再转化成真实的DOM

虚拟DOM的优点:

1. 提升了性能

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

免责声明:文章转载自《React中的虚拟DOM》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ASP漏洞+SQL注入的入侵方法matlab中集合运算函数——解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

深入理解react-native

更多内容参见个人技术博客,无广告欢迎关注转载好文《深入理解react-native》http://blog.ilibrary.me/2016/12/25/react-native-internal --------------------------------------------------------------------------------...

React 高级指引

1、代码分隔 大多数的React应用都会使用Webpack或Browserify这类的构建工具来打包文件。打包是一个将文件引入并合并 到一个单独文件的过程。接着在页面上引入该捆绑,整个应该即可一次性加载! 代码分隔是由诸如Webpack(代码分隔)和诸如因字束缚(factor-bundle)这类打包器支持的一项技术,能够创建 多个包并在运行时动态加载; 1...

react antd form 自定义表单验证validator 需要注意的细节,否则会无法触发表单提交。

1、每一个if判断后,都需要加入callback(),否则会阻塞表单的提交。 validateNoChinese = (_, value, callback) => { const reg = /^d+$|^d*.d+$/g; const startValue = value?.split('.') if(!value){...

怎样制作RSS源

我博客的rss源:http://feed.cnblogs.com/blog/u/127781/rss RSS的作用是什么? 比如你订阅了我的rss,那么如果我有文章发布,你就能及时看到更新,提供RSS输出,有利于让用户获取网站内容的最新更新。 如何订阅RSS? 在rss阅读器、QQ订阅等建立rss链接即可及时看到对应网站的更新。 怎么制作RSS源? RSS...

react源码解析7.Fiber架构

react源码解析7.Fiber架构 视频课程(高效学习):进入课程 课程目录: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 5.jsx&核心api 6.legacy和concurrent模式入口函数 7.Fiber架构 8.render阶段 9.diff算法 10.commit阶段 11.生命...

react工程目录简介

首先我们可以看到底部一个 yarn.lock的文件,这个文件主要是项目依赖的安装包,他的一些版本号,会在这里做一些限制,这个文件不要动就好了。 readme.md,这个文件其实是项目的说明文件,他里面会有一些关于项目的说明,我们可以全部删除掉,自己用markdown的语言做一些相关的介绍 package.json,基本上每个脚手架工具都会有这个pack...