index.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <script lang="ts" setup>
  2. import type { DrawerPlacement, DrawerState } from '@vben/common-ui';
  3. import { Page, useVbenDrawer } from '@vben/common-ui';
  4. import { Button, Card } from 'ant-design-vue';
  5. import DocButton from '../doc-button.vue';
  6. import AutoHeightDemo from './auto-height-demo.vue';
  7. import BaseDemo from './base-demo.vue';
  8. import DynamicDemo from './dynamic-demo.vue';
  9. import FormDrawerDemo from './form-drawer-demo.vue';
  10. import inContentDemo from './in-content-demo.vue';
  11. import SharedDataDemo from './shared-data-demo.vue';
  12. defineOptions({ name: 'DrawerExample' });
  13. const [BaseDrawer, baseDrawerApi] = useVbenDrawer({
  14. // 连接抽离的组件
  15. connectedComponent: BaseDemo,
  16. // placement: 'left',
  17. });
  18. const [InContentDrawer, inContentDrawerApi] = useVbenDrawer({
  19. // 连接抽离的组件
  20. connectedComponent: inContentDemo,
  21. // placement: 'left',
  22. });
  23. const [AutoHeightDrawer, autoHeightDrawerApi] = useVbenDrawer({
  24. connectedComponent: AutoHeightDemo,
  25. });
  26. const [DynamicDrawer, dynamicDrawerApi] = useVbenDrawer({
  27. connectedComponent: DynamicDemo,
  28. });
  29. const [SharedDataDrawer, sharedDrawerApi] = useVbenDrawer({
  30. connectedComponent: SharedDataDemo,
  31. });
  32. const [FormDrawer, formDrawerApi] = useVbenDrawer({
  33. connectedComponent: FormDrawerDemo,
  34. });
  35. function openBaseDrawer(placement: DrawerPlacement = 'right') {
  36. baseDrawerApi.setState({ placement }).open();
  37. }
  38. function openBlurDrawer() {
  39. baseDrawerApi.setState({ overlayBlur: 5 }).open();
  40. }
  41. function openInContentDrawer(placement: DrawerPlacement = 'right') {
  42. const state: Partial<DrawerState> = { class: '', placement };
  43. if (placement === 'top') {
  44. // 页面顶部区域的层级只有200,所以设置一个低于200的值,抽屉从顶部滑出来的时候才比较合适
  45. state.zIndex = 199;
  46. }
  47. inContentDrawerApi.setState(state).open();
  48. }
  49. function openMaxContentDrawer() {
  50. // 这里只是用来演示方便。实际上自己使用的时候可以直接将这些配置卸载Drawer的属性里
  51. inContentDrawerApi.setState({ class: 'w-full', placement: 'right' }).open();
  52. }
  53. function openAutoHeightDrawer() {
  54. autoHeightDrawerApi.open();
  55. }
  56. function openDynamicDrawer() {
  57. dynamicDrawerApi.open();
  58. }
  59. function handleUpdateTitle() {
  60. dynamicDrawerApi.setState({ title: '外部动态标题' }).open();
  61. }
  62. function openSharedDrawer() {
  63. sharedDrawerApi
  64. .setData({
  65. content: '外部传递的数据 content',
  66. payload: '外部传递的数据 payload',
  67. })
  68. .open();
  69. }
  70. function openFormDrawer() {
  71. formDrawerApi
  72. .setData({
  73. // 表单值
  74. values: { field1: 'abc', field2: '123' },
  75. })
  76. .open();
  77. }
  78. </script>
  79. <template>
  80. <Page
  81. auto-content-height
  82. description="抽屉组件通常用于在当前页面上显示一个覆盖层,用以展示重要信息或提供用户交互界面。"
  83. title="抽屉组件示例"
  84. >
  85. <template #extra>
  86. <DocButton path="/components/common-ui/vben-drawer" />
  87. </template>
  88. <BaseDrawer />
  89. <InContentDrawer />
  90. <AutoHeightDrawer />
  91. <DynamicDrawer />
  92. <SharedDataDrawer />
  93. <FormDrawer />
  94. <Card class="mb-4" title="基本使用">
  95. <p class="mb-3">一个基础的抽屉示例</p>
  96. <Button class="mb-2" type="primary" @click="openBaseDrawer('right')">
  97. 右侧打开
  98. </Button>
  99. <Button
  100. class="mb-2 ml-2"
  101. type="primary"
  102. @click="openBaseDrawer('bottom')"
  103. >
  104. 底部打开
  105. </Button>
  106. <Button class="mb-2 ml-2" type="primary" @click="openBaseDrawer('left')">
  107. 左侧打开
  108. </Button>
  109. <Button class="mb-2 ml-2" type="primary" @click="openBaseDrawer('top')">
  110. 顶部打开
  111. </Button>
  112. <Button class="mb-2 ml-2" type="primary" @click="openBlurDrawer">
  113. 遮罩层模糊效果
  114. </Button>
  115. </Card>
  116. <Card class="mb-4" title="在内容区域打开">
  117. <p class="mb-3">指定抽屉在内容区域打开,不会覆盖顶部和左侧菜单等区域</p>
  118. <Button class="mb-2" type="primary" @click="openInContentDrawer('right')">
  119. 右侧打开
  120. </Button>
  121. <Button
  122. class="mb-2 ml-2"
  123. type="primary"
  124. @click="openInContentDrawer('bottom')"
  125. >
  126. 底部打开
  127. </Button>
  128. <Button
  129. class="mb-2 ml-2"
  130. type="primary"
  131. @click="openInContentDrawer('left')"
  132. >
  133. 左侧打开
  134. </Button>
  135. <Button
  136. class="mb-2 ml-2"
  137. type="primary"
  138. @click="openInContentDrawer('top')"
  139. >
  140. 顶部打开
  141. </Button>
  142. <Button class="mb-2 ml-2" type="primary" @click="openMaxContentDrawer">
  143. 内容区域全屏打开
  144. </Button>
  145. </Card>
  146. <Card class="mb-4" title="内容高度自适应滚动">
  147. <p class="mb-3">可根据内容自动计算滚动高度</p>
  148. <Button type="primary" @click="openAutoHeightDrawer">打开抽屉</Button>
  149. </Card>
  150. <Card class="mb-4" title="动态配置示例">
  151. <p class="mb-3">通过 setState 动态调整抽屉数据</p>
  152. <Button type="primary" @click="openDynamicDrawer">打开抽屉</Button>
  153. <Button class="ml-2" type="primary" @click="handleUpdateTitle">
  154. 从外部修改标题并打开
  155. </Button>
  156. </Card>
  157. <Card class="mb-4" title="内外数据共享示例">
  158. <p class="mb-3">通过共享 sharedData 来进行数据交互</p>
  159. <Button type="primary" @click="openSharedDrawer">
  160. 打开抽屉并传递数据
  161. </Button>
  162. </Card>
  163. <Card class="mb-4" title="表单抽屉示例">
  164. <p class="mb-3">打开抽屉并设置表单schema以及数据</p>
  165. <Button type="primary" @click="openFormDrawer">
  166. 打开抽屉并设置表单schema以及数据
  167. </Button>
  168. </Card>
  169. </Page>
  170. </template>