test1.vue 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <el-form ref="formRef" :model="form" :rules="rules" label-width="auto" style="max-width: 600px">
  3. <el-form-item label="Activity name" prop="name">
  4. <el-input v-model="form.name" />
  5. </el-form-item>
  6. <el-form-item label="Activity zone" prop="region">
  7. <el-select v-model="form.region" placeholder="please select your zone">
  8. <el-option label="1" value="shanghai" />
  9. <el-option label="2" value="beijing" />
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item label="Instant delivery">
  13. <el-switch v-model="form.delivery" />
  14. </el-form-item>
  15. <el-form-item label="Activity type">
  16. <el-checkbox-group v-model="form.type">
  17. <el-checkbox label="1" name="type"> Online activities </el-checkbox>
  18. <el-checkbox label="2" name="type"> Promotion activities </el-checkbox>
  19. <el-checkbox label="3" name="type"> Offline activities </el-checkbox>
  20. <el-checkbox label="4" name="type"> Simple brand exposure </el-checkbox>
  21. </el-checkbox-group>
  22. </el-form-item>
  23. <el-form-item label="Resources">
  24. <el-radio-group v-model="form.resource">
  25. <el-radio label="Sponsor">Sponsor</el-radio>
  26. <el-radio label="Venue">Venue</el-radio>
  27. </el-radio-group>
  28. </el-form-item>
  29. <el-form-item label="Activity form">
  30. <el-input v-model="form.desc" type="textarea" />
  31. </el-form-item>
  32. </el-form>
  33. </template>
  34. <script lang="ts" setup>
  35. import { ref, defineExpose, inject, watch } from 'vue'
  36. const formRef = ref(null)
  37. const myEmit = defineEmits(['form-valid'])
  38. /*获取父组件传递过来的数据,调整完毕,传给父组件实现双向绑定 start */
  39. const dyVueForm = inject('dyVueForm')
  40. const form = ref(dyVueForm.value.dy || {})
  41. watch(
  42. () => dyVueForm.value.dy,
  43. vl => (form.value = vl)
  44. )
  45. watch(
  46. () => form.value,
  47. v => (dyVueForm.value.dy = v)
  48. )
  49. /*获取父组件传递过来的数据,调整完毕,传给父组件实现双向绑定 start*/
  50. const rules = ref({
  51. name: [
  52. {
  53. required: true,
  54. message: '请填写',
  55. trigger: ['submit']
  56. }
  57. ],
  58. region: [
  59. {
  60. required: true,
  61. message: '请选择',
  62. trigger: ['submit']
  63. }
  64. ]
  65. })
  66. /**
  67. * 当前表单如果没有必填校验,则可以去掉校验规则
  68. * 直接通过myEmit('form-valid', form.value)将值传给父组件
  69. */
  70. const validateForm = () => {
  71. const formValidate = formRef.value
  72. formValidate.validate((valid: any) => {
  73. if (!valid) {
  74. return false
  75. }
  76. myEmit('form-valid')
  77. })
  78. }
  79. const getComponentData = () => {
  80. return form.value
  81. }
  82. defineExpose({
  83. // 把数据暴露给父节点使用
  84. validateForm,
  85. getComponentData
  86. })
  87. </script>