customization-content.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <template>
  2. <el-button text @click="table = true"
  3. >Open Drawer with nested table</el-button
  4. >
  5. <el-button text @click="dialog = true"
  6. >Open Drawer with nested form</el-button
  7. >
  8. <el-drawer
  9. v-model="table"
  10. title="I have a nested table inside!"
  11. direction="rtl"
  12. size="50%"
  13. >
  14. <el-table :data="gridData">
  15. <el-table-column property="date" label="Date" width="150" />
  16. <el-table-column property="name" label="Name" width="200" />
  17. <el-table-column property="address" label="Address" />
  18. </el-table>
  19. </el-drawer>
  20. <el-drawer
  21. ref="drawerRef"
  22. v-model="dialog"
  23. title="I have a nested form inside!"
  24. :before-close="handleClose"
  25. direction="ltr"
  26. class="demo-drawer"
  27. >
  28. <div class="demo-drawer__content">
  29. <el-form :model="form">
  30. <el-form-item label="Name" :label-width="formLabelWidth">
  31. <el-input v-model="form.name" autocomplete="off" />
  32. </el-form-item>
  33. <el-form-item label="Area" :label-width="formLabelWidth">
  34. <el-select
  35. v-model="form.region"
  36. placeholder="Please select activity area"
  37. >
  38. <el-option label="Area1" value="shanghai" />
  39. <el-option label="Area2" value="beijing" />
  40. </el-select>
  41. </el-form-item>
  42. </el-form>
  43. <div class="demo-drawer__footer">
  44. <el-button @click="cancelForm">Cancel</el-button>
  45. <el-button type="primary" :loading="loading" @click="onClick">{{
  46. loading ? 'Submitting ...' : 'Submit'
  47. }}</el-button>
  48. </div>
  49. </div>
  50. </el-drawer>
  51. </template>
  52. <script lang="ts" setup>
  53. import { reactive, ref } from 'vue'
  54. import { ElDrawer, ElMessageBox } from 'element-plus'
  55. const formLabelWidth = '80px'
  56. let timer
  57. const table = ref(false)
  58. const dialog = ref(false)
  59. const loading = ref(false)
  60. const form = reactive({
  61. name: '',
  62. region: '',
  63. date1: '',
  64. date2: '',
  65. delivery: false,
  66. type: [],
  67. resource: '',
  68. desc: '',
  69. })
  70. const gridData = [
  71. {
  72. date: '2016-05-02',
  73. name: 'Peter Parker',
  74. address: 'Queens, New York City',
  75. },
  76. {
  77. date: '2016-05-04',
  78. name: 'Peter Parker',
  79. address: 'Queens, New York City',
  80. },
  81. {
  82. date: '2016-05-01',
  83. name: 'Peter Parker',
  84. address: 'Queens, New York City',
  85. },
  86. {
  87. date: '2016-05-03',
  88. name: 'Peter Parker',
  89. address: 'Queens, New York City',
  90. },
  91. ]
  92. const drawerRef = ref<InstanceType<typeof ElDrawer>>()
  93. const onClick = () => {
  94. drawerRef.value!.close()
  95. }
  96. const handleClose = (done) => {
  97. if (loading.value) {
  98. return
  99. }
  100. ElMessageBox.confirm('Do you want to submit?')
  101. .then(() => {
  102. loading.value = true
  103. timer = setTimeout(() => {
  104. done()
  105. // 动画关闭需要一定的时间
  106. setTimeout(() => {
  107. loading.value = false
  108. }, 400)
  109. }, 2000)
  110. })
  111. .catch(() => {
  112. // catch error
  113. })
  114. }
  115. const cancelForm = () => {
  116. loading.value = false
  117. dialog.value = false
  118. clearTimeout(timer)
  119. }
  120. </script>