UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 10.8 kB
{"version":3,"file":"render-helper.mjs","names":[],"sources":["../../../../../../../packages/components/table/src/table-column/render-helper.ts"],"sourcesContent":["import {\n Comment,\n Fragment,\n computed,\n createTextVNode,\n getCurrentInstance,\n h,\n ref,\n renderSlot,\n unref,\n watchEffect,\n} from 'vue'\nimport { debugWarn, isArray, isUndefined } from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport {\n cellForced,\n defaultRenderCell,\n getDefaultClassName,\n treeCellPrefix,\n} from '../config'\nimport { ensureValidVNode, parseMinWidth, parseWidth } from '../util'\n\nimport type { ComputedRef, RendererNode, Slots, VNode } from 'vue'\nimport type { TableColumn, TableColumnCtx } from './defaults'\nimport type { DefaultRow, Table } from '../table/defaults'\n\nfunction useRender<T extends DefaultRow>(\n props: TableColumnCtx<T>,\n slots: Slots,\n owner: ComputedRef<Table<T>>\n) {\n const instance = getCurrentInstance() as TableColumn<T>\n const columnId = ref('')\n const isSubColumn = ref(false)\n const realAlign = ref<string | null>()\n const realHeaderAlign = ref<string | null | undefined>()\n const ns = useNamespace('table')\n watchEffect(() => {\n realAlign.value = props.align ? `is-${props.align}` : null\n // nextline help render\n realAlign.value\n })\n watchEffect(() => {\n realHeaderAlign.value = props.headerAlign\n ? `is-${props.headerAlign}`\n : realAlign.value\n // nextline help render\n realHeaderAlign.value\n })\n const columnOrTableParent = computed<Table<T> | TableColumn<T>>(() => {\n let parent: any = instance.vnode.vParent || instance.parent\n while (parent && !parent.tableId && !parent.columnId) {\n parent = parent.vnode.vParent || parent.parent\n }\n return parent\n })\n const hasTreeColumn = computed<boolean>(() => {\n const { store } = (instance.parent as Table<T>)!\n if (!store) return false\n const { treeData } = store.states\n const treeDataValue = treeData.value\n return treeDataValue && Object.keys(treeDataValue).length > 0\n })\n\n const realWidth = ref(parseWidth(props.width))\n const realMinWidth = ref(parseMinWidth(props.minWidth))\n const setColumnWidth = (column: TableColumnCtx<T>) => {\n if (realWidth.value) column.width = realWidth.value\n if (realMinWidth.value) {\n column.minWidth = realMinWidth.value\n }\n if (!realWidth.value && realMinWidth.value) {\n column.width = undefined\n }\n if (!column.minWidth) {\n column.minWidth = 80\n }\n column.realWidth = Number(\n isUndefined(column.width) ? column.minWidth : column.width\n )\n return column\n }\n const setColumnForcedProps = (column: TableColumnCtx<T>) => {\n // 对于特定类型的 column,某些属性不允许设置\n const type = column.type\n const source = cellForced[type as keyof typeof cellForced] || {}\n Object.keys(source).forEach((prop) => {\n const value = source[prop as keyof typeof source]\n if (prop !== 'className' && !isUndefined(value)) {\n ;(column as any)[prop] = value\n }\n })\n const className = getDefaultClassName(type)\n if (className) {\n const forceClass = `${unref(ns.namespace)}-${className}`\n column.className = column.className\n ? `${column.className} ${forceClass}`\n : forceClass\n }\n return column\n }\n\n const checkSubColumn = (children: VNode | VNode[]) => {\n if (isArray(children)) {\n children.forEach((child) => check(child))\n } else {\n check(children)\n }\n function check(item: any) {\n if (item?.type?.name === 'ElTableColumn') {\n item.vParent = instance\n }\n }\n }\n const setColumnRenders = (column: TableColumnCtx<T>) => {\n // renderHeader 属性不推荐使用。\n //@ts-expect-error\n if (props.renderHeader) {\n debugWarn(\n 'TableColumn',\n 'Comparing to render-header, scoped-slot header is easier to use. We recommend users to use scoped-slot header.'\n )\n } else if (column.type !== 'selection') {\n column.renderHeader = (scope) => {\n // help render\n instance.columnConfig.value['label']\n\n if (slots.header) {\n const slotResult = slots.header(scope)\n // Manual valid check to support v-if fallback\n // and bypass renderSlot to support HMR\n if (ensureValidVNode(slotResult)) {\n return h(Fragment, slotResult)\n }\n }\n\n return createTextVNode(column.label)\n }\n }\n\n if (slots['filter-icon']) {\n column.renderFilterIcon = (scope) => {\n return renderSlot(slots, 'filter-icon', scope)\n }\n }\n\n if (slots.expand) {\n column.renderExpand = (scope) => {\n return renderSlot(slots, 'expand', scope)\n }\n }\n\n let originRenderCell = column.renderCell\n // TODO: 这里的实现调整\n if (column.type === 'expand') {\n // 对于展开行,renderCell 不允许配置的。在上一步中已经设置过,这里需要简单封装一下。\n column.renderCell = (data) =>\n h(\n 'div',\n {\n class: 'cell',\n },\n [originRenderCell(data)]\n )\n owner.value.renderExpanded = (row) => {\n return slots.default ? slots.default(row) : slots.default\n }\n } else {\n originRenderCell = originRenderCell || defaultRenderCell\n // 对 renderCell 进行包装\n column.renderCell = (data) => {\n let children: VNode | VNode[] | null = null\n if (slots.default) {\n const vnodes = slots.default(data)\n children = vnodes.some((v) => v.type !== Comment)\n ? vnodes\n : originRenderCell(data)\n } else {\n children = originRenderCell(data)\n }\n\n const { columns } = owner.value.store.states\n const firstUserColumnIndex = columns.value.findIndex(\n (item) => item.type === 'default'\n )\n const shouldCreatePlaceholder =\n hasTreeColumn.value && data.cellIndex === firstUserColumnIndex\n const prefix = treeCellPrefix(data, shouldCreatePlaceholder)\n const props = {\n class: 'cell',\n style: {},\n }\n if (column.showOverflowTooltip) {\n props.class = `${props.class} ${unref(ns.namespace)}-tooltip`\n props.style = {\n width: `${\n (data.column.realWidth || Number(data.column.width)) - 1\n }px`,\n }\n }\n checkSubColumn(children)\n return h('div', props, [prefix, children])\n }\n }\n return column\n }\n const getPropsData = (...propsKey: string[][]) => {\n return propsKey.reduce(\n (prev, cur) => {\n if (isArray(cur)) {\n cur.forEach((key) => {\n prev[key] = props[key as keyof TableColumnCtx<T>]\n })\n }\n return prev\n },\n {} as Record<string, any>\n )\n }\n const getColumnElIndex = (children: T[], child: RendererNode | null) => {\n return Array.prototype.indexOf.call(children, child)\n }\n\n const updateColumnOrder = () => {\n owner.value.store.commit('updateColumnOrder', instance.columnConfig.value)\n }\n\n return {\n columnId,\n realAlign,\n isSubColumn,\n realHeaderAlign,\n columnOrTableParent,\n setColumnWidth,\n setColumnForcedProps,\n setColumnRenders,\n getPropsData,\n getColumnElIndex,\n updateColumnOrder,\n }\n}\n\nexport default useRender\n"],"mappings":"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"}