You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.1 KiB
TypeScript

import type { Form, FormExpose } from '@/components/Form'
import type { ElForm } from 'element-plus'
import { ref, unref, nextTick } from 'vue'
export const useForm = () => {
// From实例
const formRef = ref<typeof Form & FormExpose>()
// ElForm实例
const elFormRef = ref<ComponentRef<typeof ElForm>>()
/**
* @param ref Form
* @param elRef ElForm
*/
const register = (ref: typeof Form & FormExpose, elRef: ComponentRef<typeof ElForm>) => {
formRef.value = ref
elFormRef.value = elRef
}
const getForm = async () => {
const form = unref(formRef)
if (!form) {
console.error('The form is not registered. Please use the register method to register')
}
await nextTick()
return form
}
// 一些内置的方法
const methods: {
setValues: (data: FormSetValuesType[]) => void
getFormData: () => Promise<Recordable | undefined>
setSchema: (schemaProps: FormSetValuesType[]) => void
addSchema: (formSchema: FormSchema, index?: number) => void
delSchema: (index: number) => void
} = {
/**
* @param field
* @param value
*/
setValues: async (data: FormSetValuesType[]) => {
const form = await getForm()
form?.setValues(data)
},
/**
* @param schemaProps schemaProps
*/
setSchema: async (schemaProps: FormSetPropsType[]) => {
const form = await getForm()
form?.setSchema(schemaProps)
},
/**
* @param formSchema
* @param index
*/
addSchema: async (formSchema: FormSchema, index?: number) => {
const form = await getForm()
form?.addSchema(formSchema, index)
},
/**
* @param index
*/
delSchema: async (index: number) => {
const form = await getForm()
form?.delSchema(index)
},
/**
* @returns form data
*/
getFormData: async (): Promise<Recordable | undefined> => {
const form = await getForm()
return form?.formModel || undefined
}
}
return {
register,
elFormRef,
methods
}
}