使用sortablejs拖拽el-table排序时,对于纯文本表格,正常使用即可,不会卡顿
initSort() { const tbody = document.querySelector('.el-table__body-wrapper tbody') const _this = this Sortable.create(tbody, { draggable: '.el-table__row', filter: ".handle", handle: ".allowDrag", preventOnFilter: false, onEnd: evt => { const {newIndex, oldIndex} = evt; const temp = _this.tableData[oldIndex]; if (!temp || temp === "undefined") { return } const currRow = _this.tableData.splice(oldIndex, 1)[0]; _this.tableData.splice(newIndex, 0, currRow); } }) },
initSort在请求到数据后执行
但是对于表格单元格中有嵌套表单组件,左右有固定fixed的列,这时推拽会卡顿
解决思路:
选择拖动的行后将fixed列取消固定,开始拖动时将表单组件全部渲染成纯文本,拖动结束后再变成初始状态,也可以在拖动时将后面的列全部用骨架屏代替,只保留名称几列信息,拖动结束后再变成初始状态,可以给表格加loading渲染
代码:
<el-table-column prop="fieldName" label="显示名称" width="200px" class-name="handle" :fixed="isFixed ? 'left' : false"> <template slot-scope="scope"> <template v-if="!isDrop"> <el-input v-model="scope.row.fieldName"></el-input> </template> <template v-else> <span>{{ scope.row.fieldName }}</span> </template> </template> </el-table-column>
initSort() { const tbody = document.querySelector('.el-table__body-wrapper tbody') const _this = this Sortable.create(tbody, { draggable: '.el-table__row', filter: ".handle", handle: ".allowDrag", preventOnFilter: false, onStart: function (/**Event*/evt) { // 是否拖动 _this.isDrop = true; }, onChoose: function (/**Event*/evt) {
// 是否固定列 _this.isFixed = false; }, onEnd: evt => { _this.tableScreenLoading = true; const {newIndex, oldIndex} = evt; const temp = _this.tableData[oldIndex]; if (!temp || temp === "undefined") { return } const currRow = _this.tableData.splice(oldIndex, 1)[0]; _this.tableData.splice(newIndex, 0, currRow); setTimeout(() => { _this.isDrop = false; },1000) setTimeout(() => { _this.$refs.table.doLayout(); _this.tableScreenLoading = false; _this.isFixed = true; _this.scrollTable(10); },1200) } }) },
渲染后固定的列显示第一行,滚动条和非固定列显示在拖动结束那里
拖动后可以加滚动,随意滚动一下即可
// 添加fixed列后 fixed列显示在第一行 让列表滚动一下 scrollTable(pixels) { const tableBodyWrapper = this.$refs.table.$el.querySelector('.el-table__body-wrapper'); if (tableBodyWrapper) { tableBodyWrapper.scrollTop += pixels; } },
标签:el,const,oldIndex,拖动,sortablejs,table,evt From: https://www.cnblogs.com/Console-LIJIE/p/18367464