Demo03GradeForm.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <el-form
  3. ref="formRef"
  4. :model="formData"
  5. :rules="formRules"
  6. label-width="100px"
  7. v-loading="formLoading"
  8. >
  9. <el-form-item label="名字" prop="name">
  10. <el-input v-model="formData.name" placeholder="请输入名字" />
  11. </el-form-item>
  12. <el-form-item label="班主任" prop="teacher">
  13. <el-input v-model="formData.teacher" placeholder="请输入班主任" />
  14. </el-form-item>
  15. </el-form>
  16. </template>
  17. <script setup lang="ts">
  18. import * as Demo03StudentApi from '@/api/infra/demo/demo03/inner'
  19. const props = defineProps<{
  20. studentId: undefined // 学生编号(主表的关联字段)
  21. }>()
  22. const formLoading = ref(false) // 表单的加载中
  23. const formData = ref([])
  24. const formRules = reactive({
  25. studentId: [{ required: true, message: '学生编号不能为空', trigger: 'blur' }],
  26. name: [{ required: true, message: '名字不能为空', trigger: 'blur' }],
  27. teacher: [{ required: true, message: '班主任不能为空', trigger: 'blur' }]
  28. })
  29. const formRef = ref() // 表单 Ref
  30. /** 监听主表的关联字段的变化,加载对应的子表数据 */
  31. watch(
  32. () => props.studentId,
  33. async (val) => {
  34. // 1. 重置表单
  35. formData.value = {
  36. id: undefined,
  37. studentId: undefined,
  38. name: undefined,
  39. teacher: undefined,
  40. }
  41. // 2. val 非空,则加载数据
  42. if (!val) {
  43. return;
  44. }
  45. try {
  46. formLoading.value = true
  47. const data = await Demo03StudentApi.getDemo03GradeByStudentId(val)
  48. if (!data) {
  49. return
  50. }
  51. formData.value = data
  52. } finally {
  53. formLoading.value = false
  54. }
  55. },
  56. { immediate: true }
  57. )
  58. /** 表单校验 */
  59. const validate = () => {
  60. return formRef.value.validate()
  61. }
  62. /** 表单值 */
  63. const getData = () => {
  64. return formData.value
  65. }
  66. defineExpose({ validate, getData })
  67. </script>