el-table嵌套el-popover處理卡頓的解決
😖 罪魁禍首
一個常見的場景是在表格行內以el-popover的形式對行內信息進行一些業務操作。在表格分頁10條、20條的情況下頁面運行良好,但是在分頁400條的時候會出現肉眼可見的卡頓。原因是表格渲染的popover組件太多瞭,一行如果至少3個popover組件,那麼400行至少就得渲染1200個瞭。下面就是導致卡頓的通常寫法:
<el-table-column label="操作"> <template #default="{ row }"> <el-button class="button-main button-h-28"> 通過 </el-button> <popover> <div class="popover-list-item" @click="handleLog(row)">查看日志</div> </popover> </template> </el-table-column>
😁 解決方法
el-popover提供瞭一個虛擬觸發的功能,可以將觸發內容和下拉內容分開,那這樣就可以隻用一個popover組件去涵蓋所有需要用到的場景。 像這個例子:
<template> <el-table :date="data"> <el-table-column label="審核語句" min-width="150"> <template #default="{ row }"> <template v-for="(item, index) in row.childBOList" :key="item.clause"> <div class="trigger"> <div :ref="el => (refMap[item.clause] = el)" @click="handleRef(refMap[item.clause], item, -1)" > <!-- 觸發內容1 --> </div> </div> </template> </template> </el-table-column> <el-table-column label="情感打標結果" min-width="150"> <template #default="{ row }"> <div class="trigger"> <div :ref="ref => (refMap[row.commentId] = ref)" @click="handleRef(refMap[row.commentId], row, 0)" > <!-- 觸發內容2 --> </div> </div> </template> </el-table-column> <el-table-column label="操作" min-width="150"> <template #default="{ row }"> <div class="trigger"> <div :ref="ref => (refMap[`${row.commentId}Check`] = ref)"> <!-- 觸發內容3 --> </div> </div> </template> </el-table-column> </el-table> <el-popover v-model:visible="visiblePopover" :virtual-ref="tempRef" virtual-triggering :width="popoverWidth" > <template v-if="popoverType === -1"> <!-- 業務邏輯1 --> </template> <template v-else-if="popoverType === 0"> <!-- 業務邏輯2 --> </template> <template v-else> <!-- 業務邏輯3 --> </template> </el-popover> </template> <script setup> const emotions = [ { desc: '好評', icon: 'icon-xiaolian' }, { desc: '中評', icon: 'icon-wubiaoqing' }, { desc: '差評', icon: 'icon-kulian' } ] const refMap = ref() const tempRef = ref() const visiblePopover = ref(false) // -1-字句審核 0-整句審核 1-日志查看 const popoverType = ref(0) const popoverWidth = computed(() => { [-1]: 80, [0]: 150, [1]: 90 }[popoverType.value]) const handleRef = (ref, item, type) => { tempRef.value = ref popoverType.value = type if (~type) { // ...業務邏輯1 } else { // ...業務邏輯2、3 } visiblePopover.value = true } </script> <style lang="scss" scoped> .trigger { display: contents; } </style>
現在,在這個例子中:
- popvoer以單例形式存在,不會出現400行就渲染上千個popover組件這樣的情況
- 需要一些中間狀態保存相關狀態和數據
- 不同的觸發內容外套一層div.trigger用以去解決觸發和關閉popper的沖突(當需要用到外部點擊去關閉popover的時候)
到此這篇關於el-table嵌套el-popover處理卡頓的解決的文章就介紹到這瞭,更多相關el-table嵌套el-popover卡頓內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 使用Element實現表格表頭添加搜索圖標和功能
- 關於el-table表格組件中插槽scope.row的使用方式
- vue 中使用 vxe-table 制作可編輯表格的使用過程
- vue+element table表格實現動態列篩選的示例代碼
- elementui的el-popover修改樣式不生效的解決