render和虚拟DOM

本文介绍Vue中render函数及虚拟DOM的作用与用法,包括通过render函数创建组件、响应式原理、虚拟DOM的优势及其在Vue中的实现方式。

render和虚拟DOM

作用:一个组件的内容有两种书写方式
  1. template:通过模板语法指定组件内容
  2. render函数:通过render来确定组件内容

用法:

<script>
export default {
    functional:true
    //h是一个函数,这个函数的返回值是VNode(虚拟DOM)
    render:(h)=>{
        retrun h('h1','这是一个h1标签,且是一个组件')
    }
}
</script>

可以用template创造组件,也可以用render创造组件

如果template配置项和render配置项同时存在,以render为准

响应式:数据发生变化会再次调用render函数,产生新的虚拟dom,与初始的虚拟dom比较,通过变动更新真实dom

在这里插入图片描述

优点:render相对template更加灵活

函数h中有三个参数:

  1. 参数1:标签名
  2. 参数2:对参数1中的标签的属性设置
  3. 参数3:参数1的子元素,也可以是一个VNode数组
h('div',{'class':'myDiv'},'我是div的内容')
<div class="myDiv">我是div的内容</div>

每一个组件都会有一个render函数,用来根据不同的数据生成不同的虚拟DOM

一般通过template定义组件,vue内部会自动生成render函数

虚拟DOM

真实DOM是一个对象,它的属性非常多,在浏览器中做dom操作会消耗性能
虚拟DOM也是一个对象,但是属性相对较少,消耗性能较少,它无法在浏览器中直接显示

为什么Vue中会用到虚拟DOM
  • 虚拟DOM比真是DOM体积小一些,操作相对来说性能消耗少一些,假设要在页面删除一个DOM元素,会重绘页面
  • 虚拟DOM才可能跨端(服务器端也可以用vue),跨平台。如果直接操作真实DOM,则与浏览器强制绑定在一起,vue就失去了更多的可能性

Vue如何使用虚拟DOM

  • 所有的template都会编译成render函数
  • render函数会根据当前的数据项,生成虚拟DOM
  • 再从虚拟dom转成真实dom
操作真实DOM虚拟DOM存在多方面的区别: - **性能消耗**:操作真实DOM时,会频繁触发重排重绘,性能消耗为真实DOM增删改加上重排重绘;而虚拟DOM不会进行重排重绘,总消耗性能为虚拟DOM的增删改、真实DOM差异增删改重排重绘,相对来说虚拟DOM能减少不必要的重排重绘,性能更优[^2]。 - **操作方式**:操作真实DOM是直接对浏览器渲染页面的实际结构进行增删改查等操作,需要手动管理DOM的变化,容易出现性能问题;虚拟DOM是一个编程概念,开发者以声明式的方式编写代码描述UI的状态,框架会处理虚拟DOM到真实DOM的映射更新,开发者不必担心性能问题[^3]。 - **更新流程**:当数据发生改变时,操作真实DOM需要直接修改实际的DOM结构;而虚拟DOM先是调用render函数创建出一个新的虚拟DOM树,将新旧虚拟DOM树对比,找到最小更新量然后更新虚拟DOM节点,最后根据更新过的虚拟DOM节点,去修改对应的真实DOM节点[^4]。 以下是简单的代码示例说明两者操作方式的不同: #### 操作真实DOM ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <div id="myDiv">原始内容</div> <script> // 获取真实DOM元素 const div = document.getElementById('myDiv'); // 直接修改真实DOM内容 div.textContent = '修改后的内容'; </script> </body> </html> ``` #### 操作虚拟DOM(以Vue为例) ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> </head> <body> <div id="app">{{ message }}</div> <script> new Vue({ el: '#app', data: { message: '原始内容' }, mounted() { // 修改数据,Vue框架会自动处理虚拟DOM到真实DOM的更新 this.message = '修改后的内容'; } }); </script> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值