feat(projects): 添加表格页面示例

This commit is contained in:
Soybean 2021-12-12 21:43:26 +08:00
parent 230a50a4cf
commit 51c744c8e2
8 changed files with 123 additions and 11 deletions

View File

@ -18,9 +18,16 @@
import { NConfigProvider, NElement, zhCN, dateZhCN } from 'naive-ui'; import { NConfigProvider, NElement, zhCN, dateZhCN } from 'naive-ui';
import { NaiveProvider } from '@/components'; import { NaiveProvider } from '@/components';
import { useThemeStore } from '@/store'; import { useThemeStore } from '@/store';
import { useDarkMode } from '@/composables'; import { useDarkMode, useGlobalEvent } from '@/composables';
const theme = useThemeStore(); const theme = useThemeStore();
const { naiveTheme } = useDarkMode(); const { naiveTheme } = useDarkMode();
const { initGlobalEventListener } = useGlobalEvent();
function init() {
initGlobalEventListener();
}
init();
</script> </script>
<style></style> <style></style>

View File

@ -6,19 +6,19 @@
<n-spin :show="true" :size="loadingSize" /> <n-spin :show="true" :size="loadingSize" />
</div> </div>
<div v-show="isEmpty" class="absolute-center"> <div v-show="isEmpty" class="absolute-center">
<div class="relative text-primary" :class="emptyNetworkClass"> <div class="relative" :class="emptyNetworkClass">
<svg-empty-data /> <svg-empty-data class="text-primary" />
<p class="absolute left-0 bottom-[20%] w-full text-center">{{ emptyDesc }}</p> <p class="absolute-lb w-full text-center">{{ emptyDesc }}</p>
</div> </div>
</div> </div>
<div v-show="!network" class="absolute-center"> <div v-show="!network" class="absolute-center">
<div <div
class="relative text-primary" class="relative"
:class="[{ 'cursor-pointer': showNetworkReload }, emptyNetworkClass]" :class="[{ 'cursor-pointer': showNetworkReload }, emptyNetworkClass]"
@click="handleReload" @click="handleReload"
> >
<svg-network-error /> <svg-network-error class="text-primary" />
<p class="absolute-lb bottom-[20%] w-full text-center">{{ networkErrorDesc }}</p> <p class="absolute-lb w-full text-center">{{ networkErrorDesc }}</p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,11 +2,11 @@ import { useAuthChangeEvent } from './auth';
export function useGlobalEvent() { export function useGlobalEvent() {
/** 初始化全局监听事件 */ /** 初始化全局监听事件 */
function initGlobalListener() { function initGlobalEventListener() {
useAuthChangeEvent(); useAuthChangeEvent();
} }
return { return {
initGlobalListener initGlobalEventListener
}; };
} }

View File

@ -31,6 +31,7 @@ export type RouteKey =
| 'component' | 'component'
| 'component_button' | 'component_button'
| 'component_card' | 'component_card'
| 'component_table'
| 'multi-menu' | 'multi-menu'
| 'multi-menu_first' | 'multi-menu_first'
| 'multi-menu_first_second' | 'multi-menu_first_second'

View File

@ -211,6 +211,14 @@ const routeConstMap = new Map<RouteKey, RouteConst>([
title: '卡片' title: '卡片'
} }
], ],
[
'component_table',
{
name: 'component_table',
path: '/component/table',
title: '表格'
}
],
[ [
'multi-menu', 'multi-menu',
{ {

View File

@ -1,6 +1,6 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { BasicLayout } from '@/layouts'; import { BasicLayout } from '@/layouts';
import { ComponentButton, ComponentCard } from '@/views'; import { ComponentButton, ComponentCard, ComponentTable } from '@/views';
import { routeName, routePath, routeTitle } from '../constant'; import { routeName, routePath, routeTitle } from '../constant';
const component: RouteRecordRaw = { const component: RouteRecordRaw = {
@ -33,6 +33,16 @@ const component: RouteRecordRaw = {
requiresAuth: true, requiresAuth: true,
keepAlive: true keepAlive: true
} }
},
{
name: routeName('component_table'),
path: routePath('component_table'),
component: ComponentTable,
meta: {
title: routeTitle('component_table'),
requiresAuth: true,
keepAlive: true
}
} }
] ]
}; };

View File

@ -1,4 +1,5 @@
import ComponentButton from './button/index.vue'; import ComponentButton from './button/index.vue';
import ComponentCard from './card/index.vue'; import ComponentCard from './card/index.vue';
import ComponentTable from './table/index.vue';
export { ComponentButton, ComponentCard }; export { ComponentButton, ComponentCard, ComponentTable };

View File

@ -0,0 +1,85 @@
<template>
<div>
<n-card title="表格" class="h-full shadow-sm rounded-16px">
<n-space :vertical="true">
<n-space>
<n-button @click="getDataSource">有数据</n-button>
<n-button @click="getEmptyDataSource">空数据</n-button>
</n-space>
<loading-empty-wrapper class="h-480px" :loading="loading" :empty="empty">
<n-data-table :columns="columns" :data="dataSource" :flex-height="true" class="h-480px" />
</loading-empty-wrapper>
</n-space>
</n-card>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { NCard, NSpace, NButton, NDataTable } from 'naive-ui';
import type { DataTableColumn } from 'naive-ui';
import { LoadingEmptyWrapper } from '@/components';
import { useLoadingEmpty } from '@/hooks';
import { getRandomInterger } from '@/utils';
interface DataSource {
name: string;
age: number;
address: string;
}
const { loading, startLoading, endLoading, empty, setEmpty } = useLoadingEmpty();
const columns: DataTableColumn[] = [
{
title: 'Name',
key: 'name',
align: 'center'
},
{
title: 'Age',
key: 'age'
},
{
title: 'Address',
key: 'address'
}
];
const dataSource = ref<DataSource[]>([]);
function createDataSource(): DataSource[] {
return Array(100)
.fill(1)
.map((item, index) => {
return {
name: `Name${index}`,
age: getRandomInterger(30, 20),
address: '中国'
};
});
}
function getDataSource() {
startLoading();
setTimeout(() => {
dataSource.value = createDataSource();
endLoading();
setEmpty(!dataSource.value.length);
}, 1000);
}
function getEmptyDataSource() {
startLoading();
setTimeout(() => {
dataSource.value = [];
endLoading();
setEmpty(!dataSource.value.length);
}, 1000);
}
onMounted(() => {
getDataSource();
});
</script>
<style scoped></style>