UNPKG

element-plus

Version:

A Component Library for Vue3.0

91 lines (85 loc) 2.24 kB
import { addClass, removeClass } from '@element-plus/utils/dom' import isServer from '@element-plus/utils/isServer' import { defineComponent, getCurrentInstance, h, watch, onUnmounted, onUpdated, VNode, } from 'vue' import { hColgroup } from '../h-helper' import useLayoutObserver from '../layout-observer' import useRender from './render-helper' import { removePopper } from '../util' import { DefaultRow, Table } from '../table/defaults' import defaultProps from './defaults' export default defineComponent({ name: 'ElTableBody', props: defaultProps, setup(props) { const instance = getCurrentInstance() const parent = instance.parent as Table<DefaultRow> const { wrappedRowRender, tooltipContent, tooltipTrigger } = useRender( props, ) const { onColumnsChange, onScrollableChange } = useLayoutObserver(parent) watch(props.store.states.hoverRow, (newVal: any, oldVal: any) => { if (!props.store.states.isComplex.value || isServer) return let raf = window.requestAnimationFrame if (!raf) { raf = fn => window.setTimeout(fn, 16) } raf(() => { const rows = instance.vnode.el.querySelectorAll('.el-table__row') const oldRow = rows[oldVal] const newRow = rows[newVal] if (oldRow) { removeClass(oldRow, 'hover-row') } if (newRow) { addClass(newRow, 'hover-row') } }) }) onUnmounted(() => { removePopper?.() }) onUpdated(() => { removePopper?.() }) return { onColumnsChange, onScrollableChange, wrappedRowRender, tooltipContent, tooltipTrigger, } }, render() { const data = this.store.states.data.value || [] return h( 'table', { class: 'el-table__body', cellspacing: '0', cellpadding: '0', border: '0', }, [ hColgroup(this.store.states.columns.value), h('tbody', {}, [ data.reduce((acc: VNode[], row) => { return acc.concat( this.wrappedRowRender( row, acc.length, ), ) }, []), ]), ], ) }, })