前端可拖动排序
前端列表和样式的可拖动排序
1.步骤,前端正常写表格,并且存放字段
2.在vue生命周期函数mounted中调用初始化拖动调整顺序的方法
操作 DOM 元素:因为在 mounted()
调用时,组件的 DOM 结构已经被渲染出来,
所有 DOM 元素都是可访问的。这时候可以安全地操作 DOM 元素。
初始化第三方库:像 SortableJS 这样的第三方库,通常依赖于存在的 DOM 元素来进行操作,
因此需要在 DOM 渲染完成后进行初始化。
1 2 3 4
| mounted() { this.initSort() },
|
3.method里定义初始化排序方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| initSort() { const el = document.querySelectorAll('.el-table__body-wrapper > table > tbody')[0] console.log(el); const sortable = new Sortable(el, { onEnd: evt => { const curRow = this.projectPhaseInputList.splice(evt.oldIndex, 1)[0] this.projectPhaseInputList.splice(evt.newIndex, 0, curRow); this.adjustPhaseOrder(); } }) }
|
4.拖拽完成排序后,对数据进行进一步处理,生成弹窗
确定
:调整序号,保存
取消
:放弃调整,重新获取列表数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| adjustPhaseOrder(){ this.$confirm('是否按该顺序调整?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { this.saveAdjustPhaseOrderData(); }).catch(() => { this.getProjectPhaseInputList(); }); }, async saveAdjustPhaseOrderData(){ this.tableLoading = true; const promises = []; for (let i = 1; i <= this.projectPhaseInputList.length; i++) { if(i != this.projectPhaseInputList[i-1].phaseOrder){ this.projectPhaseInputList[i-1].phaseOrder = i; promises.push(saveProjectPhaseInput(this.projectPhaseInputList[i-1]).then(response => { })); } } await Promise.all(promises); this.tableLoading = false; }
getProjectPhaseInputList() { this.tableLoading = true; getProjectPhaseInputByConfigId(this.projectTypeConfig.boProjectTypeConfigId) .then(response => { this.projectPhaseInputList = response; this.tableLoading = false; }); }
|
拖动可排序
同上,使用sortable的开源库,获取dom元素,
执行回调:移除被拖动的行,将移除的行插入到新的位置
再次执行,对拖拽完成的数据进一步处理
主要不同的地方是:dom元素的获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| initSort2(){ const el2 = document.querySelectorAll('#tagInput')[0];
const sortable2 = new Sortable(el2, { onEnd: evt => { const curRow = this.projectPhaseInput.fileList.splice(evt.oldIndex, 1)[0] this.projectPhaseInput.fileList.splice(evt.newIndex, 0, curRow); console.log(this.projectPhaseInput.fileList); } }) },
|
1 2 3 4
| const el = document.querySelectorAll('.el-table__body-wrapper > table > tbody')[0]
const el2 = document.querySelectorAll('#tagInput')[0];
|
table查看信息中的dom元素
tag查看信息中的dom元素
1 2
| const el2 = document.querySelectorAll('#tagInput')[0];
|
这里就很奇怪,只有点击了添加附件类型才能生成dom元素tag
才能拿到,有点小bug
解决bug方法
1 2 3 4 5 6 7 8 9
| watch: { 'projectPhaseInput.fileList'(newVal, oldVal) { if (newVal.length > 0) { this.$nextTick(() => { this.initSort2(); }); } } }
|
设置监听器,监听tag列表新值,和旧值的变化,
再$nextTick
是 Vue.js 中的一个方法,用于在下一次 DOM 更新循环之后执行回调。这确保了 DOM 已经完成更新,然后再执行接下来的操作。
就可以拿到dom元素了
再执行初始化拖动就可以获取dom元素了