最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue2中使用自定義指令實(shí)現(xiàn)el-table虛擬列表的代碼示例

 更新時(shí)間:2025年01月15日 09:29:48   作者:程序員張張  
在實(shí)際開(kāi)發(fā)中,我們可能會(huì)面臨其他需求,例如在 el-table 中無(wú)法使用分頁(yè)技術(shù)的情況下展示海量數(shù)據(jù),這種情況下,頁(yè)面可能會(huì)出現(xiàn)卡頓,嚴(yán)重時(shí)甚至可能引發(fā)瀏覽器崩潰,所以針對(duì)這個(gè)問(wèn)題本文給大家介紹了vue2中使用自定義指令實(shí)現(xiàn)el-table虛擬列表,需要的朋友可以參考下

引言

上一篇文章我們講了虛擬列表的實(shí)現(xiàn)原理,以及在vue3中的使用實(shí)例,感興趣的友友們可以查看相關(guān)內(nèi)容 傳送門。然而,在實(shí)際開(kāi)發(fā)中,我們可能會(huì)面臨其他需求,例如在 el-table 中無(wú)法使用分頁(yè)技術(shù)的情況下展示海量數(shù)據(jù)。這種情況下,頁(yè)面可能會(huì)出現(xiàn)卡頓,嚴(yán)重時(shí)甚至可能引發(fā)瀏覽器崩潰。針對(duì)這一問(wèn)題,我們需要尋找其他的解決方案。

創(chuàng)建virtualTable組件

首先新建一個(gè)virtualTable.vue文件,代碼如下:

<template>
  <div style="width: 100%">
    <el-table v-virtual-list="virtual" width="100%" height="600" :data="tableData.slice(start, over)">
      <el-table-column align="center" prop="date" label="日期" :height="virtual.itemHeight" min-width="180"></el-table-column>
      <el-table-column align="center" prop="name" label="姓名" :height="virtual.itemHeight" min-width="180"></el-table-column>
      <el-table-column align="center" prop="address" label="地址" :height="virtual.itemHeight" min-width="180"></el-table-column>
    </el-table>
  </div>
</template>

<script>
let timeout = null
export default {
  name: 'virtualTable',
  data() {
    return {
      tableData: [],
      virtual: {
        itemHeight: 40, // 每一項(xiàng)高度
        scrollClass: '.el-table__body-wrapper', // 有滾動(dòng)條元素
        scrollTop: 0, // 滾動(dòng)條距離頂部距離
        tableHeight: 0 // 可視區(qū)高度
      }
    }
  },
  computed: {
    // 起始下標(biāo)
    start() {
      return Math.max(Math.ceil(this.virtual.scrollTop / this.virtual.itemHeight - 5), 0)
    },
    // 結(jié)束下標(biāo)
    over() {
      return Math.min(
        Math.ceil((this.virtual.scrollTop + this.virtual.tableHeight + 1) / this.virtual.itemHeight + 5),
        this.tableData.length
      )
    },
    // 為了保持列表高度完整且滾動(dòng)條能正常滾
    paddingAttr() {
      let bottom = (this.tableData.length - this.over) * this.virtual.itemHeight
      let top = this.start * this.virtual.itemHeight
      return `${top}px 0 ${bottom}px 0`
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      let _arr = []
      for (let i = 1; i <= 100000; i++) {
        _arr.push({
          date: '2016-05-02',
          name: '王小虎' + i,
          address: `上海市普陀區(qū)金沙江路 ${i} 弄`
        })
      }
      this.tableData = _arr
      timeout = setTimeout(() => {
        const target = document.querySelector(this.virtual.scrollClass)
        this.virtual.tableHeight = target.clientHeight ?? 0
        this.setPaddingAttr(target)
      })
    },
    // 更新padding屬性
    setPaddingAttr(target) {
      let _table = target.querySelector('table')
      _table.style.padding = this.paddingAttr
    }
  },
  beforeDestroy() {
    clearTimeout(timeout)
  }
}
</script>

<style scoped>
::v-deep th,
::v-deep td {
  height: 40px;
  line-height: 40px;
  padding: 0;
}
</style>

代碼介紹

這邊重點(diǎn)說(shuō)一下里面的關(guān)鍵代碼,具體原理可以參考我上一篇文章 傳送門

  • virtual對(duì)象

virtual對(duì)象虛擬列表相關(guān)的屬性,放在一個(gè)對(duì)象中方便管理,需要傳入到自定義指令中。

  • timeout = setTimeout(() => {})

為了解決組件初始化時(shí)nextTick中無(wú)法獲取到正確的clientHeight。

  • this.virtual.tableHeight = target.clientHeight ?? 0

組件初始化時(shí)獲取容器的可視區(qū)高度。

  • this.setPaddingAttr(target)

設(shè)置paddingAttr方法,重新計(jì)算padding,為了確保虛擬列表的渲染效果正確。

tips

當(dāng)然這里我們可以將其封裝成一個(gè)公共的組件,如果有相同的需求直接使用當(dāng)前組件。這里我就不去封裝了,感興趣的友友們可以去嘗試一下。

添加自定義指令

// 虛擬列表自定義指令
Vue.directive('virtual-list', {
  bind(el, bind, vNode) {
    const that = vNode.context
    let virtual = bind.value
    if (virtual) {
      let target = el.querySelector(virtual.scrollClass)
      target.addEventListener('scroll', () => {
        // 更新滾動(dòng)條位置
        that.virtual.scrollTop = target.scrollTop
        // 重新計(jì)算padding
        that.setPaddingAttr(target)
      })
    }
  }
})

關(guān)鍵代碼介紹

  • const taht = vNode.context

獲取當(dāng)前指令所在組件的上下文this,以便在后續(xù)的代碼中訪問(wèn)組件的方法和數(shù)據(jù)。

  • let virtual = bind.value

獲取組件中傳入的值,內(nèi)部包含虛擬列表的相關(guān)信息。

  • target.addEventListener('scroll', () => {...})

給容器添加滾動(dòng)監(jiān)聽(tīng)事件,當(dāng)用戶滾動(dòng)時(shí)觸發(fā)該事件。

  • that.virtual.scrollTop = target.scrollTop

更新組件中的 virtual.scrollTop 屬性,記錄當(dāng)前滾動(dòng)條的位置。

  • that.setPaddingAttr(target)

該方法由當(dāng)前指令所在組件內(nèi)部提供。重新計(jì)算padding,為了確保虛擬列表的渲染效果正確。

最終效果如下:

tips

該自定義指令不僅可以在 el-table 中實(shí)現(xiàn)虛擬列表,還可以在 el-select 等組件中使用。在實(shí)際開(kāi)發(fā)中,只要了解其原理,就可以有效地應(yīng)用于實(shí)際操作中。

文章小尾巴

以上就是Vue2中使用自定義指令實(shí)現(xiàn)el-table虛擬列表的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Vue2 el-table虛擬列表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue 移動(dòng)端適配方案詳解

    vue 移動(dòng)端適配方案詳解

    這篇文章主要介紹了vue 移動(dòng)端適配方案詳解,詳細(xì)的介紹2種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題

    解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題

    這篇文章主要介紹了解決vue-seamless-scroll滾動(dòng)加點(diǎn)贊銜接處數(shù)據(jù)不同步問(wèn)題,初步判斷可能是因?yàn)橄路綉医觱ue-seamless-scroll是靜態(tài)的,沒(méi)同步DOM,本文給大家分享解決方法,感興趣的朋友一起看看吧
    2021-11-11
  • 詳解vuex commit保存數(shù)據(jù)技巧

    詳解vuex commit保存數(shù)據(jù)技巧

    這篇文章主要介紹了詳解vuex commit保存數(shù)據(jù)技巧,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • element-ui?el-upload實(shí)現(xiàn)上傳文件及簡(jiǎn)單的上傳文件格式驗(yàn)證功能

    element-ui?el-upload實(shí)現(xiàn)上傳文件及簡(jiǎn)單的上傳文件格式驗(yàn)證功能

    前端上傳文件后,后端接受文件進(jìn)行處理后直接返回處理后的文件,前端直接再將文件下載下來(lái),下面這篇文章主要給大家介紹了關(guān)于element-ui?el-upload實(shí)現(xiàn)上傳文件及簡(jiǎn)單的上傳文件格式驗(yàn)證功能的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 使用Element的InfiniteScroll 無(wú)限滾動(dòng)組件報(bào)錯(cuò)的解決

    使用Element的InfiniteScroll 無(wú)限滾動(dòng)組件報(bào)錯(cuò)的解決

    這篇文章主要介紹了使用Element的InfiniteScroll 無(wú)限滾動(dòng)組件報(bào)錯(cuò)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 基于vue實(shí)現(xiàn)網(wǎng)站前臺(tái)的權(quán)限管理(前后端分離實(shí)踐)

    基于vue實(shí)現(xiàn)網(wǎng)站前臺(tái)的權(quán)限管理(前后端分離實(shí)踐)

    這篇文章主要介紹了基于vue實(shí)現(xiàn)網(wǎng)站前臺(tái)的權(quán)限管理(前后端分離實(shí)踐),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • VUE前端工程報(bào)錯(cuò)監(jiān)控問(wèn)題及解決

    VUE前端工程報(bào)錯(cuò)監(jiān)控問(wèn)題及解決

    文章介紹了在Vue3項(xiàng)目中實(shí)現(xiàn)錯(cuò)誤捕獲和郵件報(bào)錯(cuò)上報(bào)的方法,首先使用了`errorHandler`全局錯(cuò)誤捕獲,接著通過(guò)Nodemailer發(fā)送郵件實(shí)現(xiàn)錯(cuò)誤上報(bào)功能,過(guò)程中遇到一些坑,如需本地調(diào)試需用node啟動(dòng)服務(wù),同時(shí)總結(jié)了兩種方案的,包括直接存在的問(wèn)題和限制
    2026-04-04
  • vue組件中的數(shù)據(jù)傳遞方法

    vue組件中的數(shù)據(jù)傳遞方法

    這篇文章主要介紹了vue組件中的數(shù)據(jù)傳遞方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • 在 vue-cli v3.0 中使用 SCSS/SASS的方法

    在 vue-cli v3.0 中使用 SCSS/SASS的方法

    關(guān)于如何在 vue-cli v3.0 中使用 SCSS/SASS,這里提供三種方案。感興趣的朋友通過(guò)本文一起學(xué)習(xí)吧
    2018-06-06
  • vue3使用socket.io的踩坑實(shí)戰(zhàn)記錄

    vue3使用socket.io的踩坑實(shí)戰(zhàn)記錄

    Socket.io將Websocket和輪詢機(jī)制以及其它的實(shí)時(shí)通信方式封裝成了通用的接口,并且在服務(wù)端實(shí)現(xiàn)了這些實(shí)時(shí)機(jī)制的相應(yīng)代碼,下面這篇文章主要給大家介紹了關(guān)于vue3使用socket.io踩坑的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

剑河县| 株洲市| 潮安县| 长乐市| 仙游县| 阿克苏市| 锦州市| 阿合奇县| 盐池县| 闻喜县| 斗六市| 威信县| 页游| 普兰县| 张北县| 长顺县| 寿宁县| 满城县| 米脂县| 芦溪县| 鄂温| 惠东县| 大安市| 齐齐哈尔市| 鲁甸县| 新化县| 贵阳市| 安达市| 易门县| 东阳市| 长治市| 昭苏县| 泉州市| 和平县| 高陵县| 宿松县| 德江县| 香河县| 建始县| 宁明县| 东辽县|