in packages/vue/src/components/ReactiveField.ts [68:146]
default: resolveComponent(() => [], content),
}
}
}
const patchSlot =
(slotName: string) =>
(...originArgs) =>
slots[slotName]?.({ field, form: field.form, ...originArgs[0] }) ?? []
const patchedSlots: Record<string, (...args: any) => unknown[]> = {}
slotNames.forEach((name) => {
patchedSlots[name] = patchSlot(name)
})
// for named slots
if (content && typeof content === 'object' && !isVueOptions(content)) {
Object.keys(content).forEach((key) => {
const child = content[key]
const slot = patchedSlots[key] ?? (() => [])
patchedSlots[key] = resolveComponent(slot, child)
})
return patchedSlots
}
// maybe default slot is empty
patchedSlots['default'] = resolveComponent(
patchedSlots['default'] ?? (() => []),
content
)
return patchedSlots
}
const createFieldInVue2 = (innerCreateField) => {
return () => {
let res: GeneralField
const disposer = reaction(() => {
res = innerCreateField()
})
disposer()
return res
}
}
export default observer({
name: 'ReactiveField',
props: {
fieldType: {
type: String,
default: 'Field',
},
fieldProps: {
type: Object,
default: () => ({}),
},
},
setup(props: IReactiveFieldProps, { slots }) {
const formRef = useForm()
const parentRef = useField()
const optionsRef = inject(SchemaOptionsSymbol, ref(null))
let createField = () =>
formRef?.value?.[`create${props.fieldType}`]?.({
...props.fieldProps,
basePath: props.fieldProps?.basePath ?? parentRef.value?.address,
})
if (isVue2) {
createField = createFieldInVue2(createField)
}
const fieldRef = shallowRef(createField()) as Ref<GeneralField>
watch(
() => props.fieldProps,
() => (fieldRef.value = createField())
)
useAttach(fieldRef)
provide(FieldSymbol, fieldRef)
return () => {
const field = fieldRef.value
const options = optionsRef.value
if (!field) {