Vue学习06--虚拟节点

本文介绍了Vue中的虚拟DOM概念,包括其基本原理、优势以及如何通过render方法和createElement函数创建虚拟节点。在实践中,详细展示了如何在main.js中实例化Vue并编写render方法,解释了各个参数的含义,并通过一个示例展示了如何构建复杂的虚拟节点树。同时,文章指出组件是.vue文件,后续章节将深入探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue学习06–虚拟节点

虚拟节点(virtual dom)

在Vue中没有真实的Dom节点,在代码中写的dom都是虚拟dom(VDom)

基本原理:
虚拟dom是一个普通对象,它是描述真实dom的js对象,它至少会包含tag属性(描述当前节点是一个什么元素),VNodeData属性(描述当前节点有哪些属性),VNodeChildren属性(描述当前节点有哪些子节点,特殊子节点为innerTest)
虚拟dom可以使用render方法的形参createElement方法来创建得到

优点:
虚拟DOM的更新不是直接操作dom

  • 直接操作真实dom -> 找到dom(因为dom是一个tree,需要递归去查找节点),进行innerText操作,渲染;
  • 虚拟dom -> 更新虚拟dom JS对象,然后渲染;

如果存在1000条数据遍历渲染,一次给1000的state数据进行修改

  • 真实dom:查找1000个节点,1000次赋值,1000次渲染;
  • 虚拟dom会合并赋值和查找动作一次性赋值,(1000js对象查找,1000js赋值),1次渲染;

下面先看一段代码(是main.js)

在main.js里需要对Vue进行实例化

// 需要引入Vue框架模块
import Vue from 'vue'
new Vue({
}).$mount('#app')

写到这里浏览器会报一个错
[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available.
Either pre-compile the templates into render functions, or use the compiler-included build.
是说 new Vue 的时候需要一个render方法

我们就给它写一个render方法

// 需要引入Vue框架模块
import Vue from 'vue'
new Vue({
  render(){
  }
}).$mount('#app')

写到这里还是会报一个错:
Expected to return a value in render function
是说我们的方法没有返回值,但我们目前也不知道render方法需要一个什么样的返回值,所以,在vs code里将我
们的鼠标放到render方法上去,拿到它的提示来分析。

render方法解析:
(method) ComponentOptions.render?(createElement: CreateElement): VNode

由 (method) ComponentOptions.render? 可知render是一个方法,它是组件的一个属性,其中?表示这个属性是new Vue是的非必要属性
由 : VNode 可知 render方法必须返回一个VNode(虚拟节点)
createElement: CreateElement 它是render方法的一个形参,是Vue创建虚拟节点的方法,不是document.createElement(创建的是真实节点)

所以我们接下来还要看一下这个createElement方法是如何来创建虚拟节点的;

createElement方法解析:
createElement(tag?: string | Component<any, any, any, any> | AsyncComponent, data?: VNodeData, children?: VNodeChildren): VNode

由 : VNode 可知 createElement方法执行完成以后会方法会得到一个VNode,它可以创建VNode
由 tag?: string | Component | AsyncComponent 可知 createelement方法需要的第一个参数是tag–标签,这个标签的数据类型:字符串(标签的名字),组件,异步组件
data?: VNodeData 是虚拟节点的数据对象
children?: VNodeChildren 是虚拟节点的子节点,就是一堆的子节点

简而言之:createElement方法有两个参数
参数一:标签名,字符串的形式
参数二:标签的属性

需要注意的是:createElement只能有一个顶层节点,因为render方法只接收一个createElemenet参数

// 需要引入Vue框架模块
import Vue from 'vue'
// 引入组件
import App from './App.vue'

new Vue({
  render(ce){
    const vNode = ce('div', {
      style:'color:red; font-size:18px'
    }, [
      'hello world!',  // 当前VNode的内容是一个非常特殊的子节点
      ce('a', {
        href:'#',
        style:'color:tomato'
      }, [
        '我是一个超链接',
        ce(App),
        ce('span', {}, ['span这是'])
      ])
    ])
    // debugger
    return vNode
  }
}).$mount('#app')

注意:通过$mount挂载的节点会在页面渲染的时候,会被VNode替换掉

组件:这里简单理解为有着 .vue 后缀的文件即可,详细的介绍可看下一节内容。

<think>嗯,用户想了解如何使用vue-virtual-scroller解决虚拟列表的问题。首先,我需要回忆一下虚拟列表的概念和常见的问题。虚拟列表主要是为了优化长列表的渲染性能,只渲染可视区域内的元素,减少DOM节点数量,提升性能。 接下来,vue-virtual-scroller这个库,我记得是Vue生态中的一个组件,专门用来处理大量数据的滚动列表。应该先介绍它的基本作用,比如动态渲染可见项,避免内存和性能问题。然后需要说明它的适用场景,比如聊天记录、大型表格等。 然后,可能需要分点讲解它的核心原理。比如动态计算可视区域,只渲染可见元素,以及动态调整滚动条高度。这里要注意用简单易懂的语言,避免太技术化的术语,但又要准确。 接着,用户可能想知道怎么安装和使用。应该给出具体的安装命令,比如npm install或者yarn add。然后提供一个基本的使用示例,包括引入组件、注册,以及模板中的使用方式。这里要注意代码的格式,使用正确的Vue语法,同时可能需要解释每个属性的作用,比如items是数据源,item-size是每个项的高度,key-field的作用等。 然后,可能需要提到一些常用的属性和事件,比如除了items和item-size,还有page-mode,buffer等,这些属性如何影响性能和行为。事件比如resize、visible等,用户可能需要监听这些事件来处理特定的逻辑。 高级用法部分,可能需要讲动态高度的处理,因为实际应用中每个项的高度可能不一致。这时候需要使用DynamicScroller组件,并提供一个示例代码,展示如何动态计算高度。同时,可以提到无限滚动加载的实现,结合分页请求数据,这里需要举例子,比如滚动到底部时加载更多数据,使用@scroll-end事件。 性能优化方面,可以强调避免复杂的计算和频繁的DOM操作,使用虚拟滚动本身的优势,以及合理使用key-field来保证diff效率。可能还需要提醒用户注意数据更新的处理,比如使用Vue的响应式方法来更新数据源。 最后,要总结一下vue-virtual-scroller的优势,比如提升性能,减少内存占用,支持动态高度,以及与Vue生态的良好集成。可能还要比较一下其他虚拟滚动库,比如vue-virtual-scroll-list,说明各自的适用场景。 在写作过程中,需要确保步骤清晰,代码示例正确,并且语言口语化,避免生硬。同时,注意使用中文术语,比如“组件”、“属性”、“事件”等,保持一致性。可能还需要检查是否有遗漏的重要功能或常见问题,比如如何处理滚动位置保持,或者与Vue3的兼容性,确保信息准确。</think>我来分步骤为你讲解`vue-virtual-scroller`实现虚拟列表的原理和使用方法: **一、核心原理** 1. **视窗计算**:实时计算容器可视区域范围(上/下边界位置) 2. **动态渲染**:仅渲染可视区域内的列表项(约占总数5-10%) 3. **占位填充**:用空白div撑起不可见区域的滚动空间 4. **位置映射**:通过transform: translateY保持滚动位置正确性 **二、基础使用(Vue3示例)** ```bash npm install vue-virtual-scroller ``` ```vue <script setup> import { RecycleScroller } from 'vue-virtual-scroller' const items = Array.from({length: 10000}, (_, i) => ({ id: i, text: `Item ${i}` })) </script> <template> <RecycleScroller :items="items" :item-size="50" key-field="id" class="scroller" > <template v-slot="{ item }"> <div class="item">{{ item.text }}</div> </template> </RecycleScroller> </template> <style> .scroller { height: 400px; } .item { height: 50px; padding: 12px; border-bottom: 1px solid #eee; } </style> ``` **三、核心属性说明** | 属性 | 类型 | 说明 | 默认值 | |---------------|--------|-------------------------------|---------| | items | Array | 数据源数组 | - | | item-size | Number | 预估行高(px) | - | | key-field | String | 唯一标识字段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值