我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue 长列表数据刷新的实现及思考

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue 长列表数据刷新的实现及思考

开篇

通过 vue 进行列表展示的时候如果数据太多可能会卡顿,这里通过滑动计算只创建跟刷新可见部分 dom 元素,这里仅仅代表着复用思路

一、效果展示

两列均为局部可视范围内数据刷新

二、代码

实现的主要思路:

1、提前保留可视div的高度,计算出可视高度能填满情况下最少的单元格条数;

2、根据提供的每个单元格高度和总数据条数计算出总的可滑动div高度,使其可以滑动;

3、在上述可滑动div内部再包裹一层div,此节点的作用就是在滑动过程中,改变自身的 top 值,使之在父节点滑动中始终出现在父节点的可视区域内。

4、根据滑动的距离更新vue数据,但是也只是更新能填满可视区域最小条数。

<div class="main">
    <div v-for="(dom) in longListEl" :key="dom.id" class="longList">
        <div :id="dom.id" class="contain">
            <div style="width: calc(100% - 20px);position: relative;">
                <div :style="{height:`${expectationCellHeight}px`}" v-for="(item,index) in dom.data" :key="item.id">
                    {{ item.title }}
                </div>
            </div>
        </div>
    </div>
</div>
export default {
    data() {
        return {
            longListData:[],
            expectationCellHeight:40,
            longListEl:[{id:'contain',data:[]},{id:'contain1',data:[]}],
            longListDataManages:[]
        };
    },
    mounted() {
        for(let index = 0;index < 250000;index ++){
            this.longListData.push({id:index,title:('我是第' + index + '个')})
        }
        this.$nextTick(()=>{
            this.longListEl.forEach((dom)=>{
                let containEl = document.getElementById(dom.id)
                if(containEl){
                    this.longListDataManages.push(new LongListDataManage(containEl,this.longListData,this.expectationCellHeight,(data)=>{
                        dom.data = data
                    }))
                }
            })
        })
    },
    methods: {
    },
};
function LongListDataManage(el,totalData,expectationCellHeight,refreshDataCallBack){
    this.el = el//需要操作的dom
    this.startIndex = 0//数据源的开始索引
    this.endIndex = 0//数据源的结束索引
    this.containElHeight = el ? el.offsetHeight : 0//可视区域高度
    this.totalData = totalData//全部数据源
    this.refreshDataCallBack = refreshDataCallBack//数据刷新回调
    this.expectationCellHeight = expectationCellHeight//预期的单元cell高度
    this.expectationCellFullScreenNum = 0//预期可视区域展示的单元条数
    this.expectationTotalHeight = 0//预期滑动的最大高度
    this.scrollTop = 0//当前滚动距离
    this.beginRefreshDataDistance = expectationCellHeight//滑动触发刷新数据最小距离,这里仅为一个单元格高度
    // 开始填充数据
    this.begin = function(){
        this.initData()
        this.getCurrentShowDatas()
        this.addListenerScroll()
    }
    // 初始化参数
    this.initData = function(){
        //总高度设定
        this.expectationTotalHeight = this.totalData.length * this.expectationCellHeight
        this.el.style.height = this.expectationTotalHeight + 'px'
        //数据源的结束索引设定(向上取整)
        this.endIndex = this.expectationCellFullScreenNum = Math.ceil((this.containElHeight / this.expectationCellHeight) + 0.1)
    }
    // 开始获取当前需要展示的区间
    this.getCurrentShowDatas = function(){
        //截取数据源开始跟结束节点之间的数据
        let currentData = this.totalData.slice(this.startIndex,this.endIndex)
        //给vue提供数据
        this.refreshDataCallBack(currentData)
    }
    // 监听滚动
    this.addListenerScroll = function(){
        //父节点
        let parentNode = this.el.parentNode
        //第一个子节点(改变其top值实现始终在父节点的可视区域内)
        let firstChild = this.el.firstChild
        let scrollingEvent = ()=>{
            let scrollTop = parentNode.scrollTop
            //滑动的距离超过规定的阀值或者滑动距离为0进行数据源重置
            if(Math.abs(scrollTop - this.scrollTop) >= this.beginRefreshDataDistance || scrollTop <= 0){
                //更改数据源区间索引
                this.startIndex = Math.ceil(scrollTop / this.expectationCellHeight)
                this.endIndex = this.startIndex + this.expectationCellFullScreenNum
                //上下平移可视区域展示dom,实现屏幕相对位置不变
                firstChild.style.top = scrollTop + 'px'
                //回传数据源
                this.getCurrentShowDatas()
                this.scrollTop = scrollTop
            }
        }
        //开始监听滚动
        parentNode.addEventListener("scroll", scrollingEvent)
    }
}

复用其实是由vue来处理的,这里仅是将刷新数据进行了筛选以达到刷新最小数据条数的目的,这里仅仅是简单的实现思路,希望对大家有帮助,更多关于vue 长列表数据刷新的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue 长列表数据刷新的实现及思考

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

下载Word文档

猜你喜欢

vue 长列表数据刷新的实现及思考

这篇文章主要为大家介绍了vue 长列表数据刷新的实现及思考,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-14

vue长列表数据刷新怎么实现

本篇内容介绍了“vue长列表数据刷新怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、效果展示两列均为局部可视范围内数据刷新二、代码
2023-07-05

Android TableLayout数据列表的回显清空实现思路及代码

代码如下: //数据列表的回显 public void shujuList(){ List customerList = dao.findALL(); TableLayout tl = (TableLayout) fin
2022-06-06

Android编程实现在Activity中操作刷新另外一个Activity数据列表的方法

本文实例讲述了Android编程实现在Activity中操作刷新另外一个Activity数据列表的方法。分享给大家供大家参考,具体如下:做Android项目中遇到这样一个问题:有两个acticity,一个显示好友列表,另外一个显示会话列表,
2023-05-31

Android中获取网页表单中的数据实现思路及代码

MainActivity如下: 代码如下: package cn.testjavascript; import java.util.StringTokenizer; import android.os.Bundle; import and
2022-06-06

Android开发中如何实现数据库升级且表添加新列的方法

这篇文章给大家分享的是有关Android开发中如何实现数据库升级且表添加新列的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:突然想到我们android版本升级的时候经常会遇到升级版本的时候在新版本中
2023-05-30

编程热搜

目录