首页 > 其他分享 >Table的虚拟列表和无限滚动

Table的虚拟列表和无限滚动

时间:2023-01-02 21:33:09浏览次数:41  
标签:count 滚动 idx tableData Table 列表 data page

Table的虚拟列表和无限滚动

一、使用自定义指令实现滚动到底部加载数据

在main.js中加入loadmore指令

Vue.directive('loadmore', {
  bind(el, binding) {
    const bodyWrapper = el.querySelector('.el-table__body-wrapper');
    bodyWrapper.addEventListener('scroll', function() {
      if(this.scrollHeight - this.scrollTop <= this.clientHeight) {
        binding.value();
      }
    })
  }
})

实现

<template>
  <div>
      <el-table
            :data="tableData"
            border
            height="200px"
            v-loadmore="loadMore"
            style="width: 100%"
            >
            <el-table-column prop="index" label="序号" width="180"></el-table-column>
            <el-table-column prop="name" label="姓名" width="180"></el-table-column>
        </el-table>
  </div>
</template>

<script>
// 通过指令的方法实现滚动加载v-loadmore="loadMore"
export default {
    name: "",
    data() {
        return {
            tableData: [],
            page: 1,
        }
    },
    created() {
        this.queryData(0);
    },
    methods: {
        loadMore() {
            setTimeout(() => {
                this.queryData(1);
            }, 1000);
        },
        queryData(i) {
            this.page++;
            const data = new Array(10).fill(0).map((_, index) => ({
                index: index,
                name: "sdaaas"+(index * this.page++)
            }))
            
            this.tableData = i ? this.tableData.concat(data) : data
        },
    }
}
</script>

二、使用ElementUI提供的无限加载滚动指令v-el-table-infinite-scroll

安装npm install el-table-infinite-scroll

若使用的是2.x的版本,则需另外安装npm install @vue/composition-api

<template>
  <div>
      <el-table
        :data="tableData"
        border
        height="200px"
        style="width: 100%"
        v-el-table-infinite-scroll="loadMore"
        >
        <el-table-column prop="index" label="序号" width="180"></el-table-column>
        <el-table-column prop="name" label="姓名" width="180"></el-table-column>
      </el-table>
  </div>
</template>

<script>
export default {
    name: "",
    data() {
        return {
            tableData: [],
          	list:[],
            page: 1,
          	count: 0,
        }
    },
    created() {
        this.queryData();
    },
    methods: {
        loadMore() {
            this.count = this.count > this.page ? this.page : (this.count);
            this.tableData = this.tableData.concat(this.list.splice(this.count*20,(this.count*20)+20));
        },
        queryData() 		{
          axios.get('http://localhost:5000/getDataListStatic').then(res => {
                console.log('请求结果200条数据==', res);
                this.list = res.data;
                this.tableData = this.list.splice(0,20);
                this.page = Math.floor(this.list/20);
            })
        },
    }
}
</script>

三、第三方插件UMY

ElTable的虚拟列表封装。

官方文档http://www.umyui.com/umycomponent/installation/

安装npm install umy-ui

使用示例

<template>
   <div>
     <p style="margin: 20px 0;">
          <el-button @click="setHei(400)">设置高度为400</el-button>
          <el-button @click="setHei(600)">设置高度为600</el-button>
          <el-button @click="setHei(800)">设置高度为800</el-button>
          <el-button @click="pagingScrollTopLeft(2000)">滚动到2千位置</el-button>
          <el-button @click="pagingScrollTopLeft(5000)">滚动到5千位置</el-button>
          <el-button @click="pagingScrollTopLeft(0)">滚动到顶部</el-button>
          <el-button @click="scrollBottom">滚动到底部位置</el-button>
     </p>
     <u-table
          ref="plTable"
          :data="tableData"
          :height="height"
          use-virtual
          showBodyOverflow="title"
          showHeaderOverflow="title"
          :row-height="rowHeight"
          border>
          <u-table-column type="index" width="100" />
          <u-table-column
             v-for="item in columns"
             :key="item.id"
             :resizable="item.resizable"
             :show-overflow-tooltip="item.showOverflow"
             :prop="item.prop"
             :label="item.label"
             :fixed="item.fixed"
             :width="item.width"/>
         <u-table-column
               fixed
               label="操作"
               width="150">
               <template slot-scope="scope">
                 <span :key="scope.index">查看</span>
               </template>
             </u-table-column>
        </u-table>
    </div>
</template>
<script>
export default {
    data() {
        return {
            height: 0,
            rowHeight: 40,
            columns: Array.from({ length: 8 }, (_, idx) => ({
                prop: 'address', id: idx, label: '地址' + idx, width: 200
            })),
            tableData: Array.from({ length: 500 }, (_, idx) => ({
                id: idx + 1,
                date: '2016-05-03',
                name: 1,
                ab: '欢迎使用u-table',
                address: '北京市天安门'+idx
            }))
        }
    },
    mounted () {
        this.height = 500 // 动态设置高度
    },
    methods: {
        setHei (val) {
            this.height = val
        },
        scrollBottom () {
            this.$refs.plTable.scrollBottom()
        },
        pagingScrollTopLeft (val) {
            this.$refs.plTable.pagingScrollTopLeft(val, 0)
        },
    }
}
</script>
<style lang="less" scoped>
</style>

标签:count,滚动,idx,tableData,Table,列表,data,page
From: https://www.cnblogs.com/min77/p/17020578.html

相关文章

  • 一个精选的模型监控工具列表
    Aporia借助Aporia,数据科学家和ML工程师可以轻松地为他们在生产中运行的ML模型构建监控。特征:构建您自己的监控器:轻松定义监控逻辑。概念漂移和数据完整性检测:针对......
  • 前端技术-总结列表
    ------------------------------------------------------------------------------------------------------------------------------------------------------------......
  • C# List<T> 转 DataTable
    网上有不少List<T>转DataTable的代码,但都是要指定类型的,如: ListToDT<T>(List<T>xxxx)这样的,这样用总觉得有点别扭,想实现如List<T>item.toDataTable()这样的转换......
  • [Algorithm] Stable internships
    AcompanyhashiredNinternstoeachjoinoneofNdifferentteams.Eachinternhasrankedtheirpreferencesforwhichteamstheywishtojoin,andeachteam......
  • Codeforces 22 B. Bargaining Table 做题记录
    其实是比较基础的模拟($n<=25$),写个$O(n^4)$的暴力就过了。感觉可以用倍增优化一下,可以但没必要。……太菜了还挂了几发。反思一下,一个是写函数改来改去int类型没返......
  • 列表标签,表格标签
    ​  <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title></head><body>......
  • 列表标签,表格标签
    ​  <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title></head><body>......
  • C#.NET 随机排序集合(列表\数组) | 打乱集合(列表\数组)
    直接上代码:///<summary>///重排列表(打乱列表)///</summary>///<paramname="arr"></param>publicstaticList<string>ConfusionArray(List<string>list){......
  • leetcode-599. 两个列表的最小索引总和
    599.两个列表的最小索引总和-力扣(Leetcode)刚开始的思路是搞两个map,但是性能比较差,只需要构建一个map然后遍历第二个list即可[!添加后可以过滤一些肯定不符合条件的]......