index.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <FormDialog width="640px"
  3. :title="props.schoolTitle"
  4. :visible="editFormDialogVisible"
  5. :submitLoading="editFormDialogSubmitLoading"
  6. :defaultFormData="schoolFormData"
  7. :formItemList="filterFormItemList"
  8. @formItemChange="HandleFormItemChange"
  9. @close="CloseFormDialog"
  10. @confirm="HandleConfirmFormDialog">
  11. </FormDialog>
  12. </template>
  13. <script setup lang="ts">
  14. import { ref,watch } from 'vue';
  15. import FormDialog from '@/baseComponents/FormDialog.vue';
  16. import {formItemList} from './formDialog'
  17. // 动态变更的表单下拉配置
  18. interface DynamicFormItmOpt {
  19. key:string;
  20. selectList?:Array<{
  21. label:string,
  22. value:string
  23. }>,
  24. unionSelectList?:Array<DynamicFormItmOpt>
  25. }
  26. const props = defineProps({
  27. defaultFormData:{
  28. type:Object,
  29. required:true
  30. },
  31. schoolTitle:{
  32. type:String,
  33. default:'编辑学校'
  34. },
  35. dynamicFormItmOpt:{
  36. type:Array<DynamicFormItmOpt>,
  37. default:()=>[]
  38. }
  39. })
  40. const emit = defineEmits(['confirm'])
  41. const schoolFormData = ref({})
  42. const editFormDialogVisible = defineModel('visible')
  43. const editFormDialogSubmitLoading = defineModel('editFormDialogSubmitLoading')
  44. const filterFormItemList = ref(JSON.parse(JSON.stringify(formItemList.value)))
  45. const CloseFormDialog = ()=>{
  46. editFormDialogVisible.value = false
  47. }
  48. const HandleConfirmFormDialog = (params)=>{
  49. emit('confirm',params)
  50. }
  51. // 处理表单项变更
  52. const HandleFormItemChange = (params)=>{
  53. const {key,val,formData,subKey} = params
  54. if(key == 'provinceArea' && subKey == 'province'){
  55. // 变更地区下拉
  56. filterFormItemList.value = filterFormItemList.value.map(item=>{
  57. if(item.key == 'provinceArea'){
  58. let provinceSubSelectList = item.unionSelectList.find(unionItm=>unionItm.key == 'province')
  59. ?.selectList.find(opt=>opt.value==val)?.subData || []
  60. item.unionSelectList.map(unionItm=>{
  61. if(unionItm.key == 'district'){
  62. unionItm.selectList = provinceSubSelectList
  63. }
  64. })
  65. }
  66. return item
  67. })
  68. // 同时要清空地区选择
  69. schoolFormData.value.provinceArea.district = null
  70. }
  71. }
  72. // 动态变更表单默认值
  73. watch(()=>props.defaultFormData,(newVal)=>{
  74. schoolFormData.value = newVal
  75. },{deep:true})
  76. // 动态变更表单下拉
  77. watch(()=>props.dynamicFormItmOpt,(newVal)=>{
  78. filterFormItemList.value = filterFormItemList.value.map(item=>{
  79. let result = newVal.find(dynamicItm=>{
  80. return item.key == dynamicItm.key
  81. })
  82. if(result){
  83. if(result.unionSelectList){
  84. let dynamicUnionSelectList = result.unionSelectList
  85. let finalUnionSelectList = item.unionSelectList.map(unionItm=>{
  86. let matchDynamic = dynamicUnionSelectList.find(dynItm=>dynItm.key == unionItm.key)
  87. if(matchDynamic){
  88. unionItm.selectList = matchDynamic.selectList
  89. }
  90. return unionItm
  91. })
  92. item.unionSelectList = finalUnionSelectList
  93. }else{
  94. item.selectList = result.selectList
  95. }
  96. }
  97. return item
  98. })
  99. },{deep:true})
  100. </script>
  101. <style lang="scss" scoped>
  102. </style>