ElFormSteps.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <script setup lang="ts">
  2. import type { StepProps } from 'element-plus'
  3. import type { BasicForm, BasicFormItem } from '@/types/form'
  4. interface Props {
  5. formItem: BasicFormItem
  6. formConfig: BasicForm
  7. formData: any
  8. showSubmitBtn: boolean
  9. }
  10. const props = withDefaults(defineProps<Props>(), {
  11. active: 0,
  12. showSubmitBtn: true
  13. })
  14. const emits = defineEmits(['submit', 'next'])
  15. const stepsProps = props.formItem.props as {
  16. active: number
  17. steps: Array<StepProps>
  18. }
  19. const handleNext = () => {
  20. stepsProps.active < stepsProps.steps?.length - 1 && stepsProps.active++
  21. emits('next', props.formData)
  22. }
  23. const handleSubmit = () => {
  24. emits('submit', props.formData)
  25. }
  26. </script>
  27. <template>
  28. <el-steps class="mb-4" v-bind="stepsProps">
  29. <el-step v-for="item in stepsProps?.steps" v-bind="item"></el-step>
  30. </el-steps>
  31. <template v-for="(item, index) in formItem.children">
  32. <component
  33. :is="'el-' + item.type"
  34. :formItem="item"
  35. :formData="formData"
  36. v-if="stepsProps.active === index"
  37. ></component>
  38. </template>
  39. <div class="text-center">
  40. <el-button
  41. type="primary"
  42. @click="handleSubmit"
  43. v-if="showSubmitBtn && stepsProps.active === stepsProps.steps?.length - 1"
  44. >
  45. 提交
  46. </el-button>
  47. <el-button type="primary" @click="handleNext" v-if="stepsProps.active < stepsProps.steps?.length - 1">
  48. 下一步
  49. </el-button>
  50. </div>
  51. </template>
  52. <style lang="scss" scoped></style>