element-ui 的表格裡面使用 el-popover 實現編輯彈層功能
功能點
1、表格是沒有分頁的
2、點選編輯能定位到對應的位置,進行編輯功能
3、表格滾動時候,編輯彈層需要關閉
效果
程式碼實現
<template>
<el-table ref="multipleTable" >
<el-table-column label="操作" width="90">
<template slot-scope="scope">
<el-button type="text" @click="handleClickEdit(scope.row, $event)">編輯</el-button>
</template>
</el-table-column>
</el-table>
<!-- 編輯模板 -->
<el-popover ref="editPopover" placement="bottom-end" width="370"
v-model="visibleEdit" :reference="prevTarget" :key="popperFlag"
></el-popover>
</template>
<script>
// 節流-防抖
import { throttle } from 'throttle-debounce';
export default {
data() {
return {
visibleEdit: false,
prevTarget: null, // 編輯 Popover 的 Reference (參照),用於 popover.js 對齊兩個元素
popperFlag: false, // 用於編輯 Popover 的重新整理
};
},
watch: {
value(n) {
if(n) {
this.$nextTick(() => {
// 新增這個用於處理fixed定位導致的列表行錯位
console.log('this.$refs.multipleTable--->', this.$refs.multipleTable);
this.$refs.multipleTable.doLayout();
});
// 監聽滾動,用於編輯框的滾動移除
this.removeEditPopoverListener(n);
}
}
},
methods: {
// 監聽滾動,用於編輯框的滾動移除
removeEditPopoverListener(flag) {
let timer = setTimeout(() => {
let scrollElement = this.$refs.multipleTable.$el.querySelector('.el-table__body-wrapper');
console.log('監聽滾動,用於編輯框的滾動移除', flag, scrollElement);
//
let scrollHandle = () => {
console.log('執行--->', this.visibleEditOpinions);
if (this.visibleEditOpinions) {
this.clearEditPopperComponent();
}
}
if (flag) {
// 滾動節流
scrollElement.addEventListener('scroll', throttle(500, scrollHandle));
} else {
scrollElement.removeEventListener('scroll', scrollHandle);
}
clearTimeout(timer);
}, 0);
},
// 核取方塊選中的資料
changeSelection(row) {
this.selectData = row;
console.log('核取方塊選中的資料', this.selectData);
this.seqs = this.selectData.map((el) => { return el.seq; }).toString();
console.log('seqs---->', this.seqs);
},
// 清空編輯元件
clearEditPopperComponent() {
this.prevTarget = null;
this.popperFlag = !this.popperFlag;
this.visibleEdit = false;
},
// 點選編輯
handleClickEdit(row, e) {
//阻止事件冒泡,相容ie
if (event.stopPropagation) {
event.stopPropagation();
} else if (window.event) {
window.event.cancelBubble = true;
}
let currentTarget = e.target; // 賦值當前點選的編輯
this.editData = row; // 設定編輯資料
// 判斷是否需要切換
if (this.prevTarget === currentTarget) {
// 同一個元素重複點選
this.visibleEdit = !this.visibleEdit;
} else {
// 切換不同元素, 判斷之前是否有點選其他編輯 prevTarget
if (this.prevTarget) {
// 先清除之前的編輯框
this.clearEditPopperComponent();
// 然後生成新的編輯框
this.$nextTick(() => {
this.prevTarget = currentTarget;
this.visibleEdit = true;
});
} else {
// 首次
console.log('首次--->this.prevTarget');
this.prevTarget = currentTarget;
this.visibleEdit = true;
}
}
}
}
};
</script>
注意點
1、fixed 定位導致的列表行錯位
2、監聽滾動函式名必須具名,不然滾動的時候會導致記憶體問題,瀏覽器直接崩潰,也不能移出對應的滾動事件
3、reference 這個屬性 element 文件只說了 slot 的使用,需要去看原始碼
為什麼要用reference這樣做的原因?
如果將 el-popoper 寫在表格的編輯裡,使用 slot 的話,表格資料一多就會有效能問題,頁面很卡資料載入很慢,並且每次點選其他的編輯,會導致元件更新多次,另外,滾動的時候需要關閉,不然會編輯框滾來滾去,滾動的時候就需要考慮節流的問題。這樣一來就基本在能接受的範圍內。
js 庫連線
相關文章
- vue+iview 實現可編輯表格VueView
- (精華)2020年7月18日 vue element-ui實現表格可編輯VueUI
- vue中elementUI的表格實現自定義編輯VueUI
- element-ui的彈窗上使用btn會重新整理頁面UI
- xheditor編輯器上傳功能實現
- 協同編輯功能實現原理概述
- Go使用websocket實現彈幕功能GoWeb
- VUE+Element UI實現簡單的表格行內編輯效果VueUI
- 用 RxJS 實現一個協同編輯的表格應用JS
- element-ui table表格元件實現手風琴效果UI元件
- element-ui table 行內編輯UI
- 使用編輯器裡的聲音外掛
- iOS使用UITableView實現的富文字編輯器iOSUIView
- 開發動態編輯的表格
- Vue element-ui 裡面的table匯出excel表格 步驟VueUIExcel
- Element-UI Table 實現篩選資料功能UI
- 如何在jsp上實現報表編輯器功能?JS
- AngularJS實現的表單編輯提交功能簡單介紹AngularJS
- 編輯功能-載荷裡空欄位沒有傳
- (十一)可編輯表格EditorGridPanel
- 有贊上那個微頁面編輯完後,訪問的時候呈現編輯的內容,咋實現的呢?
- 使用jQuery和Pure.CSS建立一個可編輯的表格jQueryCSS
- 實現element-ui對話方塊可拖拽功能UI
- Android彈幕功能實現,模仿鬥魚直播的彈幕效果Android
- JS實現前臺表格排序功能JS排序
- Qt中文字編輯器實現語法高亮功能(Qscitinlla)QT
- 詳解SQL中Groupings Sets 語句的功能和底層實現邏輯SQL
- SVG 動畫實現彈性的頁面元素效果SVG動畫
- element-ui匯出表格UI
- element封裝可編輯表格元件封裝元件
- word裡面設定三線表格式
- js實現彈出層滑鼠跟隨效果JS
- javascript實現掉落彈出層------Day29JavaScript
- element-UI庫Table表格匯出Excel表格UIExcel
- 基於 OData V4 的 SAP UI5 表格控制元件如何實現建立,編輯和儲存功能試讀版UI控制元件
- 為element-ui的Select和Cascader新增彈層底部操作按鈕UI
- java實現編輯器(一)Java
- vue pc端實現 直播功能+彈幕Vue