nebv
2020-10-11 03b6025d07e4df99474f80d3fa57e8b5238ba40c
提交 | 用户 | age
2f6253 1 <template>
03b602 2   <div class="collapse-container p-2">
2f6253 3     <CollapseHeader v-bind="$props" :show="show" @expand="handleExpand" />
4     <CollapseTransition :enable="canExpan">
5       <Skeleton v-if="loading" />
6       <div class="collapse-container__body" v-else v-show="show">
7         <LazyContainer :timeout="lazyTime" v-if="lazy">
8           <slot />
faf3f4 9           <template #skeleton>
2f6253 10             <slot name="lazySkeleton" />
11           </template>
12         </LazyContainer>
13         <slot />
14       </div>
15     </CollapseTransition>
16   </div>
17 </template>
18 <script lang="ts">
19   import type { PropType } from 'vue';
20
21   import { defineComponent, ref, unref } from 'vue';
22   // component
23   import { CollapseTransition } from '/@/components/Transition/index';
24   import CollapseHeader from './CollapseHeader.vue';
25   import { Skeleton } from 'ant-design-vue';
26
27   import LazyContainer from '../LazyContainer';
28
29   import { triggerWindowResize } from '/@/utils/event/triggerWindowResizeEvent';
30   // hook
31   import { useTimeout } from '/@/hooks/core/useTimeout';
32   export default defineComponent({
33     components: { Skeleton, LazyContainer, CollapseHeader, CollapseTransition },
34     name: 'CollapseContainer',
35     props: {
36       // 标题
37       title: {
38         type: String as PropType<string>,
39         default: '',
40       },
41       // 是否可以展开
42       canExpan: {
43         type: Boolean as PropType<boolean>,
44         default: true,
45       },
46       // 标题右侧温馨提醒
47       helpMessage: {
48         type: [Array, String] as PropType<string[] | string>,
49         default: '',
50       },
51       // 展开收缩的时候是否触发window.resize,
52       // 可以适应表格和表单,当表单收缩起来,表格触发resize 自适应高度
53       triggerWindowResize: {
54         type: Boolean as PropType<boolean>,
55         default: false,
56       },
57       loading: {
58         type: Boolean as PropType<boolean>,
59         default: false,
60       },
61       // 延时加载
62       lazy: {
63         type: Boolean as PropType<boolean>,
64         default: false,
65       },
66       // 延时加载时间
67       lazyTime: {
68         type: Number as PropType<number>,
69         default: 3000,
70       },
71     },
72     setup(props) {
73       const showRef = ref(true);
74       /**
75        * @description: 处理开展事件
76        */
77       function handleExpand() {
78         const hasShow = !unref(showRef);
79         showRef.value = hasShow;
80
81         if (props.triggerWindowResize) {
82           // 这里200毫秒是因为展开有动画,
83           useTimeout(triggerWindowResize, 200);
84         }
85       }
86       return {
87         show: showRef,
88         handleExpand,
89       };
90     },
91   });
92 </script>
93 <style lang="less">
94   .collapse-container {
95     background: #fff;
96     border-radius: 8px;
97     transition: all 0.3s ease-in-out;
98
99     &.no-shadow {
100       box-shadow: none;
101     }
102
103     &__header {
104       display: flex;
105       height: 32px;
106       margin-bottom: 10px;
107       justify-content: space-between;
108       align-items: center;
109     }
110
111     &__action {
112       display: flex;
113       align-items: center;
114     }
115   }
116 </style>