col-page.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <script lang="ts" setup>
  2. import { reactive, ref } from 'vue';
  3. import { ColPage } from '@vben/common-ui';
  4. import { IconifyIcon } from '@vben/icons';
  5. import {
  6. Alert,
  7. Button,
  8. Card,
  9. Checkbox,
  10. Slider,
  11. Tag,
  12. Tooltip,
  13. } from 'ant-design-vue';
  14. const props = reactive({
  15. leftCollapsedWidth: 5,
  16. leftCollapsible: true,
  17. leftMaxWidth: 50,
  18. leftMinWidth: 20,
  19. leftWidth: 30,
  20. resizable: true,
  21. rightWidth: 70,
  22. splitHandle: false,
  23. splitLine: false,
  24. });
  25. const leftMinWidth = ref(props.leftMinWidth || 1);
  26. const leftMaxWidth = ref(props.leftMaxWidth || 100);
  27. </script>
  28. <template>
  29. <ColPage
  30. auto-content-height
  31. description="ColPage 是一个双列布局组件,支持左侧折叠、拖拽调整宽度等功能。"
  32. v-bind="props"
  33. title="ColPage 双列布局组件"
  34. >
  35. <template #title>
  36. <span class="mr-2 text-2xl font-bold">ColPage 双列布局组件</span>
  37. <Tag color="hsl(var(--destructive))">Alpha</Tag>
  38. </template>
  39. <template #left="{ isCollapsed, expand }">
  40. <div v-if="isCollapsed" @click="expand">
  41. <Tooltip title="点击展开左侧">
  42. <Button shape="circle" type="primary">
  43. <template #icon>
  44. <IconifyIcon class="text-2xl" icon="bi:arrow-right" />
  45. </template>
  46. </Button>
  47. </Tooltip>
  48. </div>
  49. <div
  50. v-else
  51. :style="{ minWidth: '200px' }"
  52. class="border-border bg-card mr-2 rounded-[var(--radius)] border p-2"
  53. >
  54. <p>这里是左侧内容</p>
  55. <p>这里是左侧内容</p>
  56. <p>这里是左侧内容</p>
  57. <p>这里是左侧内容</p>
  58. <p>这里是左侧内容</p>
  59. </div>
  60. </template>
  61. <Card class="ml-2" title="基本使用">
  62. <div class="flex flex-col gap-2">
  63. <div class="flex gap-2">
  64. <Checkbox v-model:checked="props.resizable">可拖动调整宽度</Checkbox>
  65. <Checkbox v-model:checked="props.splitLine">显示拖动分隔线</Checkbox>
  66. <Checkbox v-model:checked="props.splitHandle">显示拖动手柄</Checkbox>
  67. <Checkbox v-model:checked="props.leftCollapsible">
  68. 左侧可折叠
  69. </Checkbox>
  70. </div>
  71. <div class="flex items-center gap-2">
  72. <span>左侧最小宽度百分比:</span>
  73. <Slider
  74. v-model:value="leftMinWidth"
  75. :max="props.leftMaxWidth - 1"
  76. :min="1"
  77. style="width: 100px"
  78. @after-change="(value) => (props.leftMinWidth = value as number)"
  79. />
  80. <span>左侧最大宽度百分比:</span>
  81. <Slider
  82. v-model:value="props.leftMaxWidth"
  83. :max="100"
  84. :min="leftMaxWidth + 1"
  85. style="width: 100px"
  86. @after-change="(value) => (props.leftMaxWidth = value as number)"
  87. />
  88. </div>
  89. <Alert message="实验性的组件" show-icon type="warning">
  90. <template #description>
  91. <p>
  92. 双列布局组件是一个在Page组件上扩展的相对基础的布局组件,支持左侧折叠(当拖拽导致左侧宽度比最小宽度还要小时,还可以进入折叠状态)、拖拽调整宽度等功能。
  93. </p>
  94. <p>以上宽度设置的数值是百分比,最小值为1,最大值为100。</p>
  95. <p class="font-bold text-red-600">
  96. 这是一个实验性的组件,用法可能会发生变动,也可能最终不会被采用。在其用法正式出现在文档中之前,不建议在生产环境中使用。
  97. </p>
  98. </template>
  99. </Alert>
  100. </div>
  101. </Card>
  102. </ColPage>
  103. </template>