element-plus
Version:
A Component Library for Vue3.0
72 lines (66 loc) • 2.13 kB
text/typescript
import { defineComponent, h, inject } from 'vue'
import { addUnit } from '@element-plus/utils/util'
import { getNormalizedProps } from '@element-plus/utils/vnode'
import { elDescriptionsKey } from './token'
import type { VNode } from 'vue'
import type { IDescriptionsInject, IDescriptionsItemInject } from './descriptions.type'
export default defineComponent({
name: 'ElDescriptionsCell',
props: {
cell: {
type: Object,
},
tag: {
type: String,
},
type: {
type: String,
},
},
setup() {
const descriptions = inject(elDescriptionsKey, {} as IDescriptionsInject)
return {
descriptions,
}
},
render() {
const item = getNormalizedProps(this.cell as VNode) as IDescriptionsItemInject
const label = this.cell?.children?.label?.() || item.label
const content = this.cell?.children?.default?.()
const span = item.span
const align = item.align ? `is-${item.align}` : ''
const labelAlign = item.labelAlign ? `is-${item.labelAlign}` : '' || align
const className = item.className
const labelClassName = item.labelClassName
const style = {
width: addUnit(item.width),
minWidth: addUnit(item.minWidth),
}
switch (this.type) {
case 'label':
return h(this.tag, {
style: style,
class: ['el-descriptions__label', { 'is-bordered-label': this.descriptions.border }, labelAlign, labelClassName],
colSpan: this.descriptions.direction === 'vertical' ? span : 1,
}, label)
case 'content':
return h(this.tag, {
style: style,
class: ['el-descriptions__content', align, className],
colSpan: this.descriptions.direction === 'vertical' ? span : span * 2 - 1,
}, content)
default:
return h('td', {
style: style,
class: [align],
colSpan: span,
}, [
h('span', {
class: ['el-descriptions__label', labelClassName],
}, label),
h('span', {
class: ['el-descriptions__content', className],
}, content)])
}
},
})