广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue实现滚动加载的表格
  • 467
分享到

vue实现滚动加载的表格

2024-04-02 19:04:59 467人浏览 薄情痞子
摘要

目录实现效果滚动加载知识储备 组件封装 1. 组件命名 2. 提供的props 3.使用举例 组件封装总结 1.尽可能地使用computed计算属性 2.给表格提供插槽 另一种滚动加

实现效果

码云地址

滚动加载知识储备

参考ant-design-Vue中list滚动加载的思路,使用vue-infinite-scroll加上vue-virtual-scroller作为解决方案。

组件封装

因为整个系统使用的框架是ant-dsign-vue,所以组件封装的变量命名风格尽可能的与a-table保持一致。

1. 组件命名

XScrollTable.vue

2. 提供的props

必填字段:

dataSource -- 数据源

columns -- 表格展示的列信息,插槽用法和a-table不完全一样,下面会提到。

itemSize -- 每行数据的高度

选填字段:

rowKey -- 数据主键标识,默认为'key'

height -- 表格展示区域的高度,默认为500

pageSize -- 表格滚动每次滚动加载的数据量,默认为30

infiniteScrollDistance -- 表格触发加载的距离条件,默认为10

rowSelection -- 表格多选配置,已处理的属性有selectedRowKeys、onChange、width。默认为null,不展示多选。

3.使用举例

首先初始化10000条数据,放在表格中进行显示。


let data = new Array(10000).fill(1);

data = data.map((item1, index) => {
    let item = {};
    item.id = index;
    item.age = "姓名";
    item.address = "地址";
    return item;
});
export default data;

注意:这里之所以加了fill(1),是因为通过Array构造函数产生的数据全是empty,没有数组索引,无法进行map循环。

加载表格


<x-scroll-table
                style="margin-top: 10px"
                row-key="id"
                :itemSize="22"
                :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange,width:50}"
                :columns="columns"
                :dataSource="data">
            <template slot="action" slot-scope="{record,text}">
                <a @click="handleDetail(record)">详情</a>
            </template>
        </x-scroll-table>

组件封装总结

1.尽可能地使用computed计算属性

虽然只是简单地封装了表格,但还是需要定义了很多的属性,使用计算属性代替在data里定义变量,可以减少变量的维护工作量。

整个组件只定义了一个page变量,其它都是使用计算属性的方式。


  data() {
    return {
      // 当前展示页数
      page: 1,
    };
  },

举个栗子:

通过page属性定义一个计算属性来表示当前已经加载的数据量


 // 展示的最大下标数量,存在比总数据条数多的情况,使用slice解决这个问题
    lastIndex() {
      return this.pageSize * this.page;
    },

通过这个计算属性同时衍生出其他的计算属性


// 表示表格数据是否已经加载完毕  
busy() {
      return this.lastIndex >= this.dataSource.length;
    },
 // 当前已经加载到RecycleScroller滚动组件的数据
    tableData() {
      return this.dataSource.slice(0, this.lastIndex);
    },

通过一个page属性衍生出一系列的计算属性,我只需要维护page属性,其他都是自动计算的。

2.给表格提供插槽

首先通过表格传入的columns参数,计算出需要渲染的列,这里同样使用计算属性。


 // 将列数组转为列对象,将columnFieldKey值作为键,数组项作为值
    columnMap() {
      return this.columns.reduce((returnValue, cur) => {
        returnValue[cur[columnFieldKey]] = cur;
        return returnValue;
      }, {});
    },
    // 取数组里的列键值--columnFieldKey
    columnKeys() {
      return this.columns
          .map(item => item[columnFieldKey]);
    },

在template中遍历


<div v-for="(key) of columnKeys"
             class="ellipsis-cell"
             :key="key"
             :style="itemStyle(columnMap[key])"
        >
          <slot v-if="izSlotRender(columnMap[key])"
                :name="columnMap[key].scopedSlots.customRender"
                :record="row"
                :text="row[key]">
          </slot>
          <span v-else :title="row[key]">{{ renderItem(row, index, key) }}</span>
        </div>

  // 是否使用插槽渲染
    izSlotRender(item) {
      return item.scopedSlots && item.scopedSlots.customRender;
    },

如果在定义columns时传入了scopedSlots和customRender,将使用插槽渲染。

但是这里存在和ant-design-vue中表格插槽渲染不一样的地方。

我通过slot标签定义的插槽,在父组件获取插槽参数的时候,只能使用slot-scope="{record,text}"对象解构的方式。而ant-design-vue表格是可以直接使用slot-scope="record,text"获取参数的。

另一种滚动加载数据的实现

table数据多的时候打开页面会加载一会才显示数据,这样体验不好,所以要做滚动加载数据


<el-table :data="materielList" style="width: 100%" class="familyDataDetail" height="250">
                <el-table-column prop="eventId" label="事件ID">
                    <template scope="scope">
                        <label>{{eventMap[scope.row.eventId] == null ? '--': eventMap[scope.row.eventId].sn}}</label>
                    </template>
                </el-table-column>
                <el-table-column prop="title" label="对应事件">
                    <template scope="scope">
                        <label>{{eventMap[scope.row.eventId] == null ? '--': eventMap[scope.row.eventId].title}}</label>
                    </template>
                </el-table-column>
                <el-table-column prop="age" label="负责人">
                    <template scope="scope">
                        <label>{{eventMap == null || eventMap[scope.row.eventId] == null || eventMap[scope.row.eventId].personalInfORMation == null ? '--':
                            eventMap[scope.row.eventId].personalInformation.name}}</label>
                    </template>
                </el-table-column>
                <el-table-column prop="birthday" label="物料名称">
                    <template scope="scope">
                        <label>{{materirlName}}</label>
                    </template>
                </el-table-column>
                <el-table-column prop="idcardNo" label="状态">
                    <template scope="scope">
                        <label>{{formatType(scope.row.type)}}</label>
                    </template>
                </el-table-column>
                <el-table-column prop="relationship" label="数量">
                    <template scope="scope">
                        <label>{{formatUseNum(scope.row.useNum)}}</label>
                    </template>
                </el-table-column>
                <el-table-column prop="ethtic" label="使用时间">
                    <template scope="scope">
                        <label>{{changeTime(scope.row.createOn)}}</label>
                    </template>
                </el-table-column>
            </el-table>

下面是js部分 


methods: {
  init (param) {
  let id = param.param && param.param.id
  if(id){
      this.start = 0
          MaterialRecordService.query({param: {baseId: this.baseId, materialId: id},start: this.start,limit: 30}).then(rsp => {//初次请求数据,30条
            this.start += 30
            this.materielList = rsp.data
            MissionEventService.microList({ids: rsp.data.map(n => n.eventId)}).then(rsp3 => {
                this.eventMap = {}
                rsp3.data.forEach(n => (this.eventMap[n.id] = n))
                 
            })   
          })
  }
  },
  onScroll() {
      let inner = document.querySelector('.el-table__body-wrapper');
      if(inner.scrollHeight - inner.scrollTop <= inner.clientHeight){//为true时证明已经到底,可以请求接口
        if(this.flag){//设一个滚动事件的开关,(在data里面声明 flag: true)默认为true
             this.flag = false             
             MaterialRecordService.query({param: {baseId: this.baseId, materialId: this.entity.id},start: this.start,limit:30}).then(rsp => {//每次加载30条
              this.materielList = this.materielList.concat(rsp.data)
                  this.start += 30
                  this.flag = true
              MissionEventService.microList({ids: rsp.data.map(n => n.eventId)}).then(rsp3 => {
               rsp3.data.forEach(n => (this.eventMap[n.id] = n))
              })
             })            
        }
      }
   }
},
mounted () {
      this.init({...this.param})<br>    //监听表格dom对象的滚动事件
      document.querySelector('.el-table__body-wrapper').addEventListener('scroll', this.onScroll);
    }

在这里我要说明一下监听的dom对象是哪一个

我还要解释下scrollHeight、scrollTop、clientHeight这三个属性

这是我截的别人的图加了几笔

scrollHeight:网页正文全文高度,

scrollTop:网页滚动的高度,

clientHeight:网页可视区域的高度

以上就是vue实现滚动加载的表格的详细内容,更多关于vue 滚动加载的表格的资料请关注编程网其它相关文章!

--结束END--

本文标题: vue实现滚动加载的表格

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

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

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

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

下载Word文档
猜你喜欢
  • vue实现滚动加载的表格
    目录实现效果滚动加载知识储备 组件封装 1. 组件命名 2. 提供的props 3.使用举例 组件封装总结 1.尽可能地使用computed计算属性 2.给表格提供插槽 另一种滚动加...
    99+
    2022-11-12
  • vue实现纯前端表格滚动分页加载
    本文实例为大家分享了vue实现表格滚动分页加载的具体代码,供大家参考,具体内容如下 实现效果 实现过程 <div     style="width: 100%; overfl...
    99+
    2022-11-13
  • vue如何实现纯前端表格滚动分页加载
    今天小编给大家分享一下vue如何实现纯前端表格滚动分页加载的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现效果实现过程&l...
    99+
    2023-06-29
  • vue使用动画实现滚动表格效果
    本文实例为大家分享了vue使用动画实现滚动表格效果的具体代码,供大家参考,具体内容如下 需求 在一些大屏项目中,需要使用到表格行数据滚动。本文介绍在vue项目中使用动画实现滚动表格。...
    99+
    2022-11-13
  • Vue实现下拉滚动加载数据的示例
    目录第一步:安装第二步:引用第三步:使用Web项目经常会用到下拉滚动加载数据的功能,今天就来种草 Vue-infinite-loading 这个插件,讲解一下使用方法! 第一步:安装...
    99+
    2022-11-12
  • vue怎么使用动画实现滚动表格效果
    这篇文章主要介绍“vue怎么使用动画实现滚动表格效果”,在日常操作中,相信很多人在vue怎么使用动画实现滚动表格效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么使用动画实现滚动表格效果”的疑惑有所...
    99+
    2023-06-29
  • JavaScript实现动态加载删除表格
    本文实例为大家分享了JavaScript实现动态加载删除表格的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang...
    99+
    2022-11-12
  • jquery实现表格无缝滚动
    本文实例为大家分享了jquery实现表格无缝滚动的具体代码,供大家参考,具体内容如下 css部分我是用的弹性布局 *{ margin:0; ...
    99+
    2022-11-12
  • vue怎么实现滚动条加载更多数据
    这篇“vue怎么实现滚动条加载更多数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现滚动条加载更多数据”文章吧...
    99+
    2023-07-04
  • vue实现一个懒加载的树状表格实例
    目录一个懒加载的树状表格实例安装模板js代码 使用el-table懒加载树形表格时的注意点1、版本问题2、数据显示3、滚动条4、数据结构5、el-table的fixed导致...
    99+
    2022-11-13
  • Angular实现表格自滚动效果
    目录表格自滚动效果图实现原理具体实现:表格自滚动效果图 实现原理 原理:每一次的滚动都是在其setInterval()定时器的作用下,每次将DOM.scrollTop++ 具体实现...
    99+
    2022-11-12
  • vue实现列表无缝滚动
    本文实例为大家分享了vue实现列表无缝滚动的具体代码,供大家参考,具体内容如下 HTML部分代码 <template> <div id="box" clas...
    99+
    2022-11-12
  • vue如何实现一个懒加载的树状表格
    这篇文章主要介绍“vue如何实现一个懒加载的树状表格”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue如何实现一个懒加载的树状表格”文章能帮助大家解决问题。一个懒加载的树状表格实例实现一个树状表格...
    99+
    2023-06-30
  • Vue elementUI实现树形结构表格与懒加载
    目录1、实现效果2、后端实现2.1 实体类2.2 数据库中的数据结构2.3 后端接口2.4 swagger测试后端结构功能是否正常3、前端实现3.1 页面中引入el-table组件3...
    99+
    2022-11-12
  • JavaScript如何实现动态加载删除表格
    这篇文章将为大家详细讲解有关JavaScript如何实现动态加载删除表格,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下代码:<!DOCTYPE html><html...
    99+
    2023-06-14
  • 原生+React实现懒加载(无限滚动)列表方式
    目录应用场景效果预览思路剖析原生代码实现迁移到React总结应用场景 懒加载列表或叫做无限滚动列表,也是一种性能优化的方式,其可疑不必一次性请求所有数据,可以看做是分页的另一种实现形...
    99+
    2023-03-24
    React懒加载 React无限滚动 React列表
  • vue实现列表固定列滚动
    目录功能介绍:大致需求:整体思路:具体实现:一、display:flex布局,分为四组容器布局:二、列表头部、内部数据绑定:三、列表滚动联动:四、去除头部、左侧列表滚动标签的滚动条:...
    99+
    2022-09-27
  • jQuery实现表格行数据滚动效果
    本文实例为大家分享了jQuery实现表格行数据滚动效果的具体代码,供大家参考,具体内容如下 HTML代码: <div class="box"> <div c...
    99+
    2022-11-12
  • Angular怎么实现表格自滚动效果
    这篇文章主要为大家分析了Angular怎么实现表格自滚动效果的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Angular怎么实现表格自滚动效果”的知识吧。表...
    99+
    2023-06-26
  • vue实现列表无缝循环滚动
    本文实例为大家分享了vue实现列表无缝循环滚动的具体代码,供大家参考,具体内容如下 功能介绍: 在PC端网页,包括大数据、官网、后台管理平台开发中,可能会用到这种列表循环滚动的展示。...
    99+
    2022-09-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作