wip(VForm): VForm component development
parent
69909e2832
commit
d9d64f3931
@ -0,0 +1,49 @@
|
|||||||
|
import { ElOption, ElOptionGroup } from 'element-plus'
|
||||||
|
import { getSlot } from '@/utils/tsxHelper'
|
||||||
|
import { Slots } from 'vue'
|
||||||
|
|
||||||
|
export function useRenderSelect(slots: Slots) {
|
||||||
|
// 渲染 select options
|
||||||
|
function renderSelectOptions(item: VFormSchema) {
|
||||||
|
// 如果有别名,就取别名
|
||||||
|
const labelAlias = item.optionsField?.labelField
|
||||||
|
return item.options?.map((option) => {
|
||||||
|
if (option?.options?.length) {
|
||||||
|
return (
|
||||||
|
<ElOptionGroup label={labelAlias ? option[labelAlias] : option['label']}>
|
||||||
|
{() => {
|
||||||
|
return option?.options?.map((v) => {
|
||||||
|
return renderSelectOptionItem(item, v)
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
</ElOptionGroup>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return renderSelectOptionItem(item, option)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 渲染 select option item
|
||||||
|
function renderSelectOptionItem(item: VFormSchema, option: FormOptions) {
|
||||||
|
// 如果有别名,就取别名
|
||||||
|
const labelAlias = item.optionsField?.labelField
|
||||||
|
const valueAlias = item.optionsField?.valueField
|
||||||
|
return (
|
||||||
|
<ElOption
|
||||||
|
label={labelAlias ? option[labelAlias] : option['label']}
|
||||||
|
value={valueAlias ? option[valueAlias] : option['value']}
|
||||||
|
>
|
||||||
|
{{
|
||||||
|
default: () =>
|
||||||
|
// option 插槽名规则,{field}-option
|
||||||
|
item.optionsSlot ? getSlot(slots, `${item.field}-option`, { item: option }) : undefined
|
||||||
|
}}
|
||||||
|
</ElOption>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
renderSelectOptions
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue