vue-virtualized-table-booway
Version:
The second version of implementation of `vue-virtual-table` component, it was inspired from [rc-table](https://github.com/react-component/table) and [ant-table](https://ant.design/components/table), API design is 60%+ consistent. Or you could think I tran
93 lines (80 loc) • 2.22 kB
JSX
/* eslint-disable vue/require-default-prop */
import Header from './index'
import ColGroup from '../ColGroup'
import { TableProps, NUMBER_PROP } from '../interface'
export default {
name: 'FixedHeader',
functional: true,
inheritAttrs: false,
inject: {
prefixCls: TableProps.prefixCls,
scrollbarSize: NUMBER_PROP
},
props: {
colWidths: Array,
columCount: Number,
direction: String,
...Header.props
},
render(h, ctx) {
const { props, injections } = ctx
const { prefixCls, scrollbarSize } = injections
const {
columns,
flattenColumns,
colWidths,
columCount,
stickyOffsets,
direction
} = props
// Add scrollbar column
const lastColumn = flattenColumns[flattenColumns.length - 1]
const ScrollBarColumn = {
fixed: lastColumn ? lastColumn.fixed : null,
class: `${prefixCls}-cell-scrollbar`
}
const columnsWithScrollbar = scrollbarSize
? [...columns, ScrollBarColumn]
: columns
const flattenColumnsWithScrollbar = scrollbarSize
? [...flattenColumns, ScrollBarColumn]
: flattenColumns
// Calculate the sticky offsets
const { right, left } = stickyOffsets
const headerStickyOffsets = {
...stickyOffsets,
left:
direction === 'rtl'
? [...left.map((width) => width + scrollbarSize), 0]
: left,
right:
direction === 'rtl'
? right
: [...right.map((width) => width + scrollbarSize), 0]
}
const cloneWidths = []
for (let i = 0; i < columCount; i += 1) {
cloneWidths[i] = colWidths[i]
}
const columnWidthsReady = !colWidths.every((width) => !width)
return (
<table
style={{
tableLayout: 'fixed',
visibility: columnWidthsReady ? null : 'hidden'
}}
>
<ColGroup
colWidths={[...colWidths, scrollbarSize]}
columCount={columCount + 1}
columns={flattenColumnsWithScrollbar}
/>
<Header
columns={columnsWithScrollbar}
stickyOffsets={headerStickyOffsets}
flattenColumns={flattenColumnsWithScrollbar}
/>
</table>
)
}
}