element Table表格组件渲染不分页数据滚动加载不分页数据

方法一:

一、定义需要用到的变量 

data() {
  return {
    count: 19, // 默认展示条数
    tableData: [], // 表格数据
    allData: [] // 所有数据
  }
}

二、在进页面或打开弹窗时获取列表数据的地方处理成需要展示的数据

// 所有数据
this.allData = response.rows
// 初始值为19
this.needle = 19
this.tableData = []
//判断数据长度有没有20个,有就先添加20个,没有直接获取所有数据
if(this.allData.length > 19){
  for(let i = 0; i < 20; i++){
    this.tableData[i] = this.allData[i]
  }
} else {
    this.tableData = this.allData
}

 三、定义滚动加载函数 

lazyLoading(){
  // 获取table的body元素
  let dom = document.getElementById('table').querySelector('.el-table__body-wrapper')
  // console.log('dom', dom)
  // 添加对滚动条的监听
  dom.addEventListener('scroll', () => {
    const scrollDistance = dom.scrollHeight - dom.scrollTop - dom.clientHeight
    // console.log('鼠标滑动-scrollDistance', scrollDistance)
    if (scrollDistance <= 0 || scrollDistance <= 1) {
      let index = 0
      // 避免添加undefined数据导致表渲染报错
      if (this.needle === this.allData.length) {
        this.needle = 0
      }
      for (let i = this.needle; i < this.needle + 5; i++) {
        if (this.tableData[i]) {
          this.tableData[i] = this.allData[i]   
          this.$set(this.tableData, i, this.allData[i])
          this.$forceUpdate()
          index = i
        }
      }
      this.needle = index + 1
    }
  })
}

四、在mounted中设置监听鼠标滚动事件  

mounted() {
  this.lazyLoading()
},

方法二: 

element Table组件实现懒加载

(1)在项目 utils 文件夹下新建自定义指令文件 directives.js

import Vue from 'vue';
import { Message } from 'element-ui';

let oList = [], nList = [], dom, noMore = false, loading = false, isFirstUpdate = true // 原数组,表格渲染数组,dom节点

function LoadMore() {
  loading = true // 触底加载中
    if (oList.length <= 0 && !noMore) {
      noMore = true
      Message({
        type: 'warning',
        message: '数据已全部加载完毕',
        duration: 3000
      })
      loading = false
      return
    }  // 如果默认数据为0,return
    let list = []
    if (oList.length > 10) {
      list = oList.splice(0, 10)
    } else {
      list = oList.splice(0, oList.length)
    }
    for (let i = 0;i < list.length;i++) {
      nList.push(list[i])
    }
    loading = false
}
// 滚动事件
function handleScroll() {
  // 表格滚动条滚动的距离
  let scrollTop = dom.scrollTop
  // 变量windowHeight是可视区的⾼度
  let windowHeight = dom.clientHeight
  // 变量scrollHeight是滚动条的总⾼度
  let scrollHeight = dom.scrollHeight
  console.log('scrollTop---start')
  console.log(loading)
  console.log(scrollTop + windowHeight + 1)
  console.log(scrollHeight)
  if (scrollTop + windowHeight + 1 >= scrollHeight && !loading) {   // 这里就是滚动条滚动到底部的时候触发
    LoadMore()
  }
}

// 表格懒加载
Vue.directive('lazyLoad', {
  inserted: function(el, binding, vnode) {
    dom = vnode.componentInstance.bodyWrapper
    console.log(666)
  },
  update: function(el, binding, vnode){
    if(binding.value.oList && binding.value.nList) {
      oList = binding.value.oList
      nList = binding.value.nList
      console.log(777)
      console.log(oList)
      console.log(nList)
      if(nList.length <= 0) {
        LoadMore()
      }
      if(isFirstUpdate) {
        isFirstUpdate = false
        window.addEventListener('scroll', handleScroll, true)
      }
    }
  },
  unbind: function(el, binding, vnode) {
    console.log(999)
    oList = []
    nList = []
    noMore = false
    loading = false
    isFirstUpdate = true
    window.removeEventListener('scroll', handleScroll, true)
  }
});

(2)在main.js文件引入

import './utils/directives';

(3)在Table组件<el-table>标签加上这个 v-lazyLoad 属性 

v-lazyLoad="{'oList': defaultData.firstItemList, 'nList': modalForm.firstItemList}"

以下仅供参考 

data() {
  return {
    modalForm: new Form(),
    defaultData: {},
  }
},
methods: {
  /** 查询demo数据 */
  openModal() {
    this.loading = true
    getQmsIpqcTFirstStandardInfo(this.command.data.id).then(res => {
    if (res.data.firstItemList && res.data.firstItemList.length > 0 &&  res.data.firstItemList.length > 10) {
      this.defaultData = JSON.parse(JSON.stringify(res.data))
      let tableList = this.defaultData.firstItemList.splice(0, 10)
      res.data.firstItemList = tableList
     }
      this.loading = false
      this.modalForm = Object.assign(new Form(), res.data)
    })
  }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你使用的是 element-ui 的 el-table 组件,并且开启了前端分页,那么默认情况下多选只能选中当前页的数据。 这是因为 el-table 组件默认只渲染当前页的数据,而不是全部数据。如果你想要在多个页面之间进行多选,你需要在 el-table 组件中添加一个自定义的多选列,并且在数据中添加一个属性来表示是否选中。 以下是一个示例代码: ```html <el-table :data="tableData" :span-method="rowSpanMethod" v-loading="loading"> <el-table-column type="selection" width="55"> <template slot-scope="{ row }"> <el-checkbox v-model="row.selected"></el-checkbox> </template> </el-table-column> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="address" label="Address"></el-table-column> </el-table> ``` ```javascript export default { data() { return { tableData: [ { name: 'John', age: 18, address: 'New York', selected: false }, { name: 'Sarah', age: 22, address: 'London', selected: false }, { name: 'Tom', age: 25, address: 'Paris', selected: false }, { name: 'Jane', age: 30, address: 'Tokyo', selected: false }, ], loading: false, }; }, methods: { rowSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { const rowSpan = this.getRowSpan(row, 'selected'); if (rowSpan > 1) { return { rowspan: rowSpan, colspan: 1, }; } } }, getRowSpan(row, prop) { let rowSpan = 1; for (let i = this.tableData.indexOf(row) + 1; i < this.tableData.length; i++) { if (this.tableData[i][prop] === row[prop]) { rowSpan++; } else { break; } } return rowSpan; }, }, }; ``` 在这个示例中,我们添加了一个名为 `selected` 的属性来表示每一行是否被选中。我们通过在 el-table-column 中添加一个自定义的列来实现多选功能,然后在模板中使用 el-checkbox 组件来绑定每一行的选中状态。我们还使用了一个自定义的 rowSpanMethod 方法来处理多选列的行合并,以便在表格中显示选中的行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想散在风中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值