New file |
| | |
| | | <template> |
| | | <div :class="isDesktop ? 'desktop-no-data' : 'no-data'"> |
| | | <img v-if="type == 'content'" :src="noContent" /> |
| | | <img v-else-if="type == 'network'" :src="noNetwork" /> |
| | | <img v-else :src="noData" /> |
| | | <slot name="no-data-text"> |
| | | <div class="no-data-text">{{ noDataText }}</div> |
| | | </slot> |
| | | </div> |
| | | </template> |
| | | <script setup lang="ts"> |
| | | import noContent from '@/assets/components/icon-no-data.png'; |
| | | import noNetwork from '@/assets/components/icon-no-net.png'; |
| | | import noData from '@/assets/components/icon-no-data.png'; |
| | | const NoDataText = { |
| | | content: '暂无内容', |
| | | data: '暂无数据', |
| | | network: '暂无网络', |
| | | }; |
| | | |
| | | type Props = { |
| | | type?: keyof typeof NoDataText; |
| | | text?: string; |
| | | isDesktop?: boolean; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | type: 'data', |
| | | text: '', |
| | | isDesktop: false, |
| | | }); |
| | | |
| | | const noDataText = computed(() => { |
| | | return props.text ? props.text : NoDataText[props.type]; |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .no-data { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | flex-direction: column; |
| | | // margin-top: 10vh; |
| | | flex: 1; |
| | | |
| | | img { |
| | | display: block; |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .no-data-text { |
| | | margin-top: 20px; |
| | | font-size: 22px; |
| | | text-align: center; |
| | | color: #67666e; |
| | | } |
| | | } |
| | | |
| | | .desktop-no-data { |
| | | padding-bottom: 16px; |
| | | |
| | | img { |
| | | display: block; |
| | | margin: 0 auto; |
| | | width: 14%; |
| | | } |
| | | |
| | | .no-data-text { |
| | | font-size: 20px; |
| | | text-align: center; |
| | | color: #67666e; |
| | | } |
| | | } |
| | | </style> |