mirror of
https://github.com/element-plus/element-plus.git
synced 2026-03-13 07:51:17 +08:00
* build: add type * chore: update * chore: update * chore: update * chore: update * chore: update * chore: update * chore: update
74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import {
|
|
onBeforeMount,
|
|
onUnmounted,
|
|
onMounted,
|
|
onUpdated,
|
|
computed,
|
|
getCurrentInstance,
|
|
} from 'vue'
|
|
import { TableLayout, TableHeader, Table } from './table.type'
|
|
|
|
function useLayoutObserver(root: Table) {
|
|
const instance = getCurrentInstance() as TableHeader
|
|
onBeforeMount(() => {
|
|
tableLayout.value.addObserver(instance)
|
|
})
|
|
onMounted(() => {
|
|
onColumnsChange(tableLayout.value)
|
|
onScrollableChange(tableLayout.value)
|
|
})
|
|
onUpdated(() => {
|
|
onColumnsChange(tableLayout.value)
|
|
onScrollableChange(tableLayout.value)
|
|
})
|
|
onUnmounted(() => {
|
|
tableLayout.value.removeObserver(instance)
|
|
})
|
|
const tableLayout = computed(() => {
|
|
const layout = root.layout as TableLayout
|
|
if (!layout) {
|
|
throw new Error('Can not find table layout.')
|
|
}
|
|
return layout
|
|
})
|
|
const onColumnsChange = (layout: TableLayout) => {
|
|
const cols = root.vnode.el?.querySelectorAll('colgroup > col')
|
|
if (!cols.length) return
|
|
const flattenColumns = layout.getFlattenColumns()
|
|
const columnsMap = {}
|
|
flattenColumns.forEach(column => {
|
|
columnsMap[column.id] = column
|
|
})
|
|
for (let i = 0, j = cols.length; i < j; i++) {
|
|
const col = cols[i]
|
|
const name = col.getAttribute('name')
|
|
const column = columnsMap[name]
|
|
if (column) {
|
|
col.setAttribute('width', column.realWidth || column.width)
|
|
}
|
|
}
|
|
}
|
|
|
|
const onScrollableChange = (layout: TableLayout) => {
|
|
const cols = root.vnode.el.querySelectorAll('colgroup > col[name=gutter]')
|
|
for (let i = 0, j = cols.length; i < j; i++) {
|
|
const col = cols[i]
|
|
col.setAttribute('width', layout.scrollY.value ? layout.gutterWidth : '0')
|
|
}
|
|
const ths = root.vnode.el.querySelectorAll('th.gutter')
|
|
for (let i = 0, j = ths.length; i < j; i++) {
|
|
const th = ths[i]
|
|
th.style.width = layout.scrollY.value ? layout.gutterWidth + 'px' : '0'
|
|
th.style.display = layout.scrollY.value ? '' : 'none'
|
|
}
|
|
}
|
|
|
|
return {
|
|
tableLayout: tableLayout.value,
|
|
onColumnsChange,
|
|
onScrollableChange,
|
|
}
|
|
}
|
|
|
|
export default useLayoutObserver
|