Demo03CourseForm.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <el-form
  3. ref="formRef"
  4. :model="formData"
  5. :rules="formRules"
  6. v-loading="formLoading"
  7. label-width="0px"
  8. :inline-message="true"
  9. >
  10. <el-table :data="formData" class="-mt-10px">
  11. <el-table-column label="序号" type="index" width="100" />
  12. <el-table-column label="名字" min-width="150">
  13. <template #default="{ row, $index }">
  14. <el-form-item :prop="`${$index}.name`" :rules="formRules.name" class="mb-0px!">
  15. <el-input v-model="row.name" placeholder="请输入名字" />
  16. </el-form-item>
  17. </template>
  18. </el-table-column>
  19. <el-table-column label="分数" min-width="150">
  20. <template #default="{ row, $index }">
  21. <el-form-item :prop="`${$index}.score`" :rules="formRules.score" class="mb-0px!">
  22. <el-input v-model="row.score" placeholder="请输入分数" />
  23. </el-form-item>
  24. </template>
  25. </el-table-column>
  26. <el-table-column align="center" fixed="right" label="操作" width="60">
  27. <template #default="{ $index }">
  28. <el-button @click="handleDelete($index)" link>—</el-button>
  29. </template>
  30. </el-table-column>
  31. </el-table>
  32. </el-form>
  33. <el-row justify="center" class="mt-3">
  34. <el-button @click="handleAdd" round>+ 添加学生课程</el-button>
  35. </el-row>
  36. </template>
  37. <script setup lang="ts">
  38. import * as Demo03StudentApi from '@/api/infra/demo/demo03/normal'
  39. const props = defineProps<{
  40. studentId: undefined // 学生编号(主表的关联字段)
  41. }>()
  42. const formLoading = ref(false) // 表单的加载中
  43. const formData = ref([])
  44. const formRules = reactive({
  45. studentId: [{ required: true, message: '学生编号不能为空', trigger: 'blur' }],
  46. name: [{ required: true, message: '名字不能为空', trigger: 'blur' }],
  47. score: [{ required: true, message: '分数不能为空', trigger: 'blur' }]
  48. })
  49. const formRef = ref() // 表单 Ref
  50. /** 监听主表的关联字段的变化,加载对应的子表数据 */
  51. watch(
  52. () => props.studentId,
  53. async (val) => {
  54. // 1. 重置表单
  55. formData.value = []
  56. // 2. val 非空,则加载数据
  57. if (!val) {
  58. return;
  59. }
  60. try {
  61. formLoading.value = true
  62. formData.value = await Demo03StudentApi.getDemo03CourseListByStudentId(val)
  63. } finally {
  64. formLoading.value = false
  65. }
  66. },
  67. { immediate: true }
  68. )
  69. /** 新增按钮操作 */
  70. const handleAdd = () => {
  71. const row = {
  72. id: undefined,
  73. studentId: undefined,
  74. name: undefined,
  75. score: undefined
  76. }
  77. row.studentId = props.studentId
  78. formData.value.push(row)
  79. }
  80. /** 删除按钮操作 */
  81. const handleDelete = (index) => {
  82. formData.value.splice(index, 1)
  83. }
  84. /** 表单校验 */
  85. const validate = () => {
  86. return formRef.value.validate()
  87. }
  88. /** 表单值 */
  89. const getData = () => {
  90. return formData.value
  91. }
  92. defineExpose({ validate, getData })
  93. </script>