1.vue2 表格自适应高度
import { addResizeListener, removeResizeListener } from "element-ui/src/utils/resize-event"
console.log(111)
const tableMin = 200
const doResize = async (el, binding, vnode) => {
const { componentInstance: $table } = await vnode
const { value } = binding
if (!$table.height) {
throw new Error(`el-$table must set the height. Such as height='100px'`)
}
const bottomOffset = (value && value.bottomOffset) || 60
if (!$table) return
let height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset
height = height < tableMin ? tableMin : height
$table.layout.setHeight(height)
$table.doLayout()
}
export default {
bind (el, binding, vnode) {
el.resizeListener = async () => {
await doResize(el, binding, vnode)
}
addResizeListener(window.document.body, el.resizeListener)
addResizeListener(el, el.resizeListener)
},
async inserted (el, binding, vnode) {
await doResize(el, binding, vnode)
},
async componentUpdated (el, binding, vnode) {
await doResize(el, binding, vnode)
},
unbind (el) {
removeResizeListener(el, el.resizeListener)
}
}
import adaptive from "./adaptive"
const install = function (Vue) {
Vue.directive("adaptive", adaptive)
}
if (window.Vue) {
window["adaptive"] = adaptive
Vue.use(install)
}
adaptive.install = install
export default adaptive
import adaptive from "./directive/adaptive"
2.vue3 自适应高度
import type { DirectiveBinding } from 'vue'
interface ExHTMLElement extends HTMLElement {
resizeListener: EventListener
}
export default {
mounted: (el: ExHTMLElement, binding: DirectiveBinding) => {
el.resizeListener = () => {
setHeight(el, binding)
}
setHeight(el, binding)
window.addEventListener('resize', el.resizeListener)
},
unmounted(el: ExHTMLElement) {
window.removeEventListener('resize', el.resizeListener)
},
updated(el: ExHTMLElement, binding: DirectiveBinding) {
setHeight(el, binding)
}
}
function setHeight(el: ExHTMLElement, binding: DirectiveBinding) {
const top = el.offsetTop
const bottom = binding?.value?.bottom || 84
const pageHeight = window.innerHeight
el.style.height = pageHeight - top - bottom + 'px'
el.style.overflowY = 'auto'
}
import adaptive from "./adaptive";
import type { App } from 'vue'
export default (app: App) => {
app.directive('adaptive', adaptive)
}
3 table拖拽列
<el-table
v-column-drag="{ columns: columns, onDragEnd: handleDragEnd }"
:data="tableData"
style="width: 100%">
<el-table-column
v-for="col in columns"
:key="col.prop"
:prop="col.prop"
:label="col.label"
:width="col.width">
</el-table-column>
</el-table>
Vue.directive('column-drag', {
inserted(el, binding) {
const tableHeader = el.querySelector('.el-table__header-wrapper thead tr');
if (!tableHeader) return;
const { columns, onDragEnd } = binding.value;
Sortable.create(tableHeader, {
animation: 150,
onEnd({ oldIndex, newIndex }) {
if (oldIndex === newIndex) return;
const movedItem = columns.splice(oldIndex, 1)[0];
columns.splice(newIndex, 0, movedItem);
if (typeof onDragEnd === 'function') {
onDragEnd(oldIndex, newIndex, columns);
}
}
});
}
});
handleDragEnd(oldIndex, newIndex, columns) {
this.$message.success(`列已移动:从第 ${oldIndex + 1} 列到第 ${newIndex + 1} 列`);
console.log('最新列顺序:', columns);
}