validation.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <el-form
  3. ref="ruleFormRef"
  4. :model="ruleForm"
  5. :rules="rules"
  6. label-width="120px"
  7. class="demo-ruleForm"
  8. :size="formSize"
  9. status-icon
  10. >
  11. <el-form-item label="Activity name" prop="name">
  12. <el-input v-model="ruleForm.name" />
  13. </el-form-item>
  14. <el-form-item label="Activity zone" prop="region">
  15. <el-select v-model="ruleForm.region" placeholder="Activity zone">
  16. <el-option label="Zone one" value="shanghai" />
  17. <el-option label="Zone two" value="beijing" />
  18. </el-select>
  19. </el-form-item>
  20. <el-form-item label="Activity count" prop="count">
  21. <el-select-v2
  22. v-model="ruleForm.count"
  23. placeholder="Activity count"
  24. :options="options"
  25. />
  26. </el-form-item>
  27. <el-form-item label="Activity time" required>
  28. <el-col :span="11">
  29. <el-form-item prop="date1">
  30. <el-date-picker
  31. v-model="ruleForm.date1"
  32. type="date"
  33. label="Pick a date"
  34. placeholder="Pick a date"
  35. style="width: 100%"
  36. />
  37. </el-form-item>
  38. </el-col>
  39. <el-col class="text-center" :span="2">
  40. <span class="text-gray-500">-</span>
  41. </el-col>
  42. <el-col :span="11">
  43. <el-form-item prop="date2">
  44. <el-time-picker
  45. v-model="ruleForm.date2"
  46. label="Pick a time"
  47. placeholder="Pick a time"
  48. style="width: 100%"
  49. />
  50. </el-form-item>
  51. </el-col>
  52. </el-form-item>
  53. <el-form-item label="Instant delivery" prop="delivery">
  54. <el-switch v-model="ruleForm.delivery" />
  55. </el-form-item>
  56. <el-form-item label="Activity type" prop="type">
  57. <el-checkbox-group v-model="ruleForm.type">
  58. <el-checkbox label="Online activities" name="type" />
  59. <el-checkbox label="Promotion activities" name="type" />
  60. <el-checkbox label="Offline activities" name="type" />
  61. <el-checkbox label="Simple brand exposure" name="type" />
  62. </el-checkbox-group>
  63. </el-form-item>
  64. <el-form-item label="Resources" prop="resource">
  65. <el-radio-group v-model="ruleForm.resource">
  66. <el-radio label="Sponsorship" />
  67. <el-radio label="Venue" />
  68. </el-radio-group>
  69. </el-form-item>
  70. <el-form-item label="Activity form" prop="desc">
  71. <el-input v-model="ruleForm.desc" type="textarea" />
  72. </el-form-item>
  73. <el-form-item>
  74. <el-button type="primary" @click="submitForm(ruleFormRef)">
  75. Create
  76. </el-button>
  77. <el-button @click="resetForm(ruleFormRef)">Reset</el-button>
  78. </el-form-item>
  79. </el-form>
  80. </template>
  81. <script lang="ts" setup>
  82. import { reactive, ref } from 'vue'
  83. import type { FormInstance, FormRules } from 'element-plus'
  84. const formSize = ref('default')
  85. const ruleFormRef = ref<FormInstance>()
  86. const ruleForm = reactive({
  87. name: 'Hello',
  88. region: '',
  89. count: '',
  90. date1: '',
  91. date2: '',
  92. delivery: false,
  93. type: [],
  94. resource: '',
  95. desc: '',
  96. })
  97. const rules = reactive<FormRules>({
  98. name: [
  99. { required: true, message: 'Please input Activity name', trigger: 'blur' },
  100. { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
  101. ],
  102. region: [
  103. {
  104. required: true,
  105. message: 'Please select Activity zone',
  106. trigger: 'change',
  107. },
  108. ],
  109. count: [
  110. {
  111. required: true,
  112. message: 'Please select Activity count',
  113. trigger: 'change',
  114. },
  115. ],
  116. date1: [
  117. {
  118. type: 'date',
  119. required: true,
  120. message: 'Please pick a date',
  121. trigger: 'change',
  122. },
  123. ],
  124. date2: [
  125. {
  126. type: 'date',
  127. required: true,
  128. message: 'Please pick a time',
  129. trigger: 'change',
  130. },
  131. ],
  132. type: [
  133. {
  134. type: 'array',
  135. required: true,
  136. message: 'Please select at least one activity type',
  137. trigger: 'change',
  138. },
  139. ],
  140. resource: [
  141. {
  142. required: true,
  143. message: 'Please select activity resource',
  144. trigger: 'change',
  145. },
  146. ],
  147. desc: [
  148. { required: true, message: 'Please input activity form', trigger: 'blur' },
  149. ],
  150. })
  151. const submitForm = async (formEl: FormInstance | undefined) => {
  152. if (!formEl) return
  153. await formEl.validate((valid, fields) => {
  154. if (valid) {
  155. console.log('submit!')
  156. } else {
  157. console.log('error submit!', fields)
  158. }
  159. })
  160. }
  161. const resetForm = (formEl: FormInstance | undefined) => {
  162. if (!formEl) return
  163. formEl.resetFields()
  164. }
  165. const options = Array.from({ length: 10000 }).map((_, idx) => ({
  166. value: `${idx + 1}`,
  167. label: `${idx + 1}`,
  168. }))
  169. </script>