iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vxe-list vue 如何实现下拉框的虚拟列表
  • 594
分享到

vxe-list vue 如何实现下拉框的虚拟列表

2024-04-02 19:04:59 594人浏览 独家记忆
摘要

目录vxe-list Vue下拉框的虚拟列表虚拟列表的实现原理接下来测试一下vue虚拟列表实现原理应用场景实现思路基础实现vxe-list vue下拉框的虚拟列表 vxe-table

vxe-list vue下拉框的虚拟列表

vxe-table vxe-list vue 实现下拉框的虚拟列表

虚拟列表的实现原理

只渲染可视区的 dom 节点,其余不可见的数据卷起来,只会渲染可视区域的 dom 节点,提高渲染性能及流畅性,优点是支持海量数据的渲染;当然也会有缺点:滚动效果相对略差(海量数据与滚动效果的取舍问题就看自己的需求喽);

<div class="my-select">
   <input type="text" class="my-select-input" readonly>
    <vxe-list class="my-select-wrapper" :loading="loading" :data="list">
        <template v-slot="{ items }">
            <div class="my-select-option" v-for="item in items" :key="item.value">{{ item.label }}</div>
        </template>
    </vxe-list>
</div>
export default {
	data () {
		return {
	      loading: false,
	      list: []
	    }
	},
	created () {
	    this.loading = true
        setTimeout(() => {
            const startTime = Date.now()
            var list = []
            for(var i=0;i<100000;i++){
                list.push({
                    label: '选项'+i,
                    value: i
                })
            }
            this.list = list
            this.loading = false
            this.$nextTick(() => {
                this.$XModal.message({ message: `渲染 ${list.length} 行,用时 ${Date.now() - startTime}毫秒`, status: 'info' })
            })
        }, 200)
	}
}
.my-select {
    width: 200px;
    position: relative;
    background-color: #fff;
}
.my-select-input {
    width: 100%;
    height: 24px;
    border: 1px solid #dcdfe6;
}
.my-select-wrapper {
    position: absolute;
    left: 0;
    top: 26px;
    width: 100%;
    height: 200px;
    background-color: #fff;
    border: 1px solid #dcdfe6;
}
.my-select-option:hover {
    background-color: #f5f7fa;
    cursor: pointer;
}

接下来测试一下

渲染 1w 条只需要 150 毫秒左右

渲染 5w 条只需要 300 毫秒左右

渲染 10w 条只需要 500 毫秒左右

具体用法可以去看 官方文档,在线运行 Http://jsrun.net/CW2Kp/edit

vue虚拟列表实现原理

应用场景

前端的业务开发中会遇到不使用分页方式来加载长列表的需求。如在数据长度大于 1000 条情况,DOM 元素的创建和渲染需要的时间成本很高,完整渲染列表所需要的时间不可接受,同时会存在滚动时卡顿问题;

解决该卡顿问题的重点在于如何降低长列表DOM渲染成本问题,文章将介绍通过虚拟列表渲染的方式解决该问题。 

为什么需要虚拟列表

虚拟列表是对长列表的一种优化方案。在前端开发中,会碰到一些不能使用分页方式来加载列表数据的业务形态,我们称这种列表叫做长列表。比如,手机端,淘宝商品展示,美团外卖等,数据量特别庞大,不适合分页,以及懒加载,这时候我们可以采用虚拟列表,只展示可视区域数据。

实现思路

虚拟列表的核心思想为可视区域渲染,在页面滚动时对数据进行截取、复用DOM进行展示的渲染方式。

实现虚拟列表就是处理滚动条滚动后的可见区域的变更,其中具体步骤如下:

1.计算当前可见区域起始数据的 startIndex

2.计算当前可见区域结束数据的 endIndex

3.计算当前可见区域的数据,并渲染到页面中

4.计算 startIndex 对应的数据在整个列表中的偏移位置 startOffset,并设置到列表上

基础实现

我们首先要考虑的是虚拟列表的 htmlCSS 如何实现:

  • 列表元素(.list-view)使用相对定位
  • 使用一个不可见元素(.list-view-phantom)撑起这个列表,让列表的滚动条出现
  • 列表的可见元素(.list-view-content)使用绝对定位,left、right、top 设置为 0

html:

<template>
     <div 
    class="list-view"
    :style="{
        height: `${height}px`
    }" 
    @scroll="handleScroll">
        <div
        class="list-view-phantom"       
        :style="{
            height: contentHeight
        }">
        </div>
        <ul
        ref="content"
        class="list-view-content">
            <li
                class="list-view-item"
                :style="{
                    height: itemHeight + 'px'
                }"
                v-for="(item, index) in visibleData" 
                :key="index">
                    {{ item }}
            </li>
        </ul>
  </div>
</template>

script:

<script>
export default {
    name: 'ListView',
    props: {
    data: {
        type: Array,
        default: function() {
            const list = []
            for (let i = 0; i < 1000000; i++) {
                list.push('列表' + i)
            }
            return list
        }
    },
    height: {
        type: Number,
        default: 400
    },
    itemHeight: {
        type: Number,
        default: 30
    },
  },
  computed: {
    contentHeight() {
        return this.data.length * this.itemHeight + 'px';
    }
  },
  mounted() {
      this.updateVisibleData();
  },
  data() {
    return {
      visibleData: []
    };
  },
  methods: {
    updateVisibleData(scrollTop) {
        scrollTop = scrollTop || 0;
        const visibleCount = Math.ceil(this.$el.clientHeight / this.itemHeight); // 取得可见区域的可见列表项数量
        const start = Math.floor(scrollTop / this.itemHeight); // 取得可见区域的起始数据索引
        const end = start + visibleCount; // 取得可见区域的结束数据索引
        this.visibleData = this.data.slice(start, end); // 计算出可见区域对应的数据,让 vue.js 更新
        this.$refs.content.style.WEBkitTransfORM = `translate3D(0, ${ start * this.itemHeight }px, 0)`; // 把可见区域的 top 设置为起始元素在整个列表中的位置(使用 transform 是为了更好的性能)
    },
    handleScroll() {
        const scrollTop = this.$el.scrollTop;
        this.updateVisibleData(scrollTop);
    }
  }
}
</script>

css:

<style lang="scss" scoped>
.list-view {
    overflow: auto;
    position: relative;
    border: 1px solid #aaa;
    width: 200px;
}
.list-view-phantom {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    z-index: -1;
}
.list-view-content {
    left: 0;
    right: 0;
    top: 0;
    position: absolute;
}
.list-view-item {
    padding: 5px;
    color: #666;
    line-height: 30px;
    box-sizing: border-box;
}
</style>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vxe-list vue 如何实现下拉框的虚拟列表

本文链接: https://www.lsjlt.com/news/150563.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vxe-list vue 如何实现下拉框的虚拟列表
    目录vxe-list vue下拉框的虚拟列表虚拟列表的实现原理接下来测试一下vue虚拟列表实现原理应用场景实现思路基础实现vxe-list vue下拉框的虚拟列表 vxe-table...
    99+
    2024-04-02
  • vxe-list vue怎么实现下拉框的虚拟列表
    本篇内容主要讲解“vxe-list vue怎么实现下拉框的虚拟列表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vxe-list vue怎么实现下拉框的虚拟列表”吧!vxe-...
    99+
    2023-06-30
  • Vue如何实现select下拉列表
    这篇“Vue如何实现select下拉列表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue如何实现select下拉列表”文...
    99+
    2023-07-04
  • vue虚拟列表如何实现
    本篇内容介绍了“vue虚拟列表如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多数据渲染现在解决多数据渲染,相信大家可能会想到分页,触...
    99+
    2023-07-02
  • vue下拉列表怎么实现
    小编给大家分享一下vue下拉列表怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vue下拉列表的两种实现第一种采用v-for的方式  &...
    99+
    2023-06-15
  • java下拉列表框如何做
    要创建一个下拉列表框(即下拉菜单)在Java中,可以使用Swing组件中的JComboBox类。以下是一个简单的例子来演示如何创建一...
    99+
    2024-03-06
    java
  • JavaScript实现下拉列表选择框
    本文实例为大家分享了JavaScript实现下拉列表选择框的具体代码,供大家参考,具体内容如下 创建一个页面 ** 两个下拉选择框     -...
    99+
    2024-04-02
  • Vue.js如何实现select下拉列表
    这篇文章主要为大家展示了“Vue.js如何实现select下拉列表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue.js如何实现select下拉列表”这篇文...
    99+
    2024-04-02
  • vue虚拟化列表封装的实现
    目录vue虚拟化列表封装将下面代码复制一份到自己的项目中 vue虚拟列表-vue-virtual-scroll-list使用场景安装使用vue虚拟化列表封装 将下面代码复制...
    99+
    2024-04-02
  • 小程序实现下拉列表框菜单
    本文实例为大家分享了小程序实现下拉列表框菜单的具体代码,供大家参考,具体内容如下 <view class='top'>   <view class='top-tex...
    99+
    2024-04-02
  • vue实现下拉框筛选表格数据
    本文实例为大家分享了vue实现下拉框筛选表格数据的具体代码,供大家参考,具体内容如下 html中: //下拉框          <el-form-item label="选择...
    99+
    2024-04-02
  • vue下拉列表的两种实现方式比较
    vue下拉列表的两种实现 第一种采用v-for的方式 <el-select v-model="form.columeType" placeholder="字段...
    99+
    2024-04-02
  • Android Studio如何实现下拉列表效果
    这篇文章主要讲解了“Android Studio如何实现下拉列表效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android Studio如何实现下拉列表效果”吧!题...
    99+
    2023-06-30
  • Vue 虚拟列表的实战示例
    目录序言 设计 实现 小结 序言 现如今,我们总是在无止境的刷。刷微博、刷抖音、刷沸点......一次次丝滑下拉体验的背后却是前端攻城狮的用心。 本篇讨论基于 Vue.js 的列表...
    99+
    2024-04-02
  • React虚拟列表的实现
    目录1.背景 2.什么是虚拟列表 3.相关概念简介 4.虚拟列表实现 4.1 驱动开发:参数剖析4.2 组件初始化计算和布局 4.3 滚动触发注册事件与更新 4.4 item高度不等...
    99+
    2024-04-02
  • angularjs如何实现下拉列表的选中事件
    这篇文章主要介绍了angularjs如何实现下拉列表的选中事件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。select标签的对于大家来说很...
    99+
    2024-04-02
  • vue如何实现可搜索下拉框功能
    这篇文章主要为大家展示了“vue如何实现可搜索下拉框功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现可搜索下拉框功能”这篇文章吧。效果图:子组件...
    99+
    2024-04-02
  • html下拉框如何实现
    小编给大家分享一下html下拉框如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加...
    99+
    2023-06-14
  • bootstrap中如何实现multiselect下拉列表功能
    这篇文章主要为大家展示了“bootstrap中如何实现multiselect下拉列表功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“bootstrap中如何实...
    99+
    2024-04-02
  • 微信小程序如何实现下拉列表
    这篇文章给大家分享的是有关微信小程序如何实现下拉列表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。微信小程序 下拉列表wxml代码: <view cla...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作