基于 Vue 3 + TypeScript + TSX + Naive UI 的数据渲染后台管理系统模板开发方案
·
基于 Vue 3 + TypeScript + TSX + Naive UI 的数据渲染后台管理系统模板开发方案:
一、技术栈配置
- 项目初始化:
npm create vue@latest my-admin -- --tsx --router --pinia
cd my-admin
npm install naive-ui @vicons/ionicons5
- TS配置 (
tsconfig.json):
{
"compilerOptions": {
"jsx": "preserve",
"jsxFactory": "h",
"types": ["naive-ui/volar"]
}
}
二、核心架构设计
// src/App.tsx
import { defineComponent } from 'vue';
import { NMessageProvider, NConfigProvider } from 'naive-ui';
import MainLayout from './layouts/MainLayout';
export default defineComponent({
setup() {
return () => (
<NConfigProvider>
<NMessageProvider>
<MainLayout />
</NMessageProvider>
</NConfigProvider>
);
}
});
三、动态路由系统
// src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router';
import { NIcon } from 'naive-ui';
import { BookOutline } from '@vicons/ionicons5';
const routes = [
{
path: '/',
component: () => import('@/views/Dashboard'),
meta: {
title: '仪表盘',
icon: () => <NIcon><BookOutline /></NIcon>
}
},
// 动态路由示例
{
path: '/:resource',
component: () => import('@/views/ResourceList'),
props: route => ({ resourceType: route.params.resource })
}
];
export default createRouter({
history: createWebHistory(),
routes
});
四、数据渲染核心组件
// src/components/DataTable.tsx
import { defineComponent, PropType } from 'vue';
import { NDataTable, DataTableColumn } from 'naive-ui';
export default defineComponent({
props: {
data: {
type: Array as PropType<Record<string, any>[]>,
required: true
},
columns: {
type: Array as PropType<DataTableColumn[]>,
required: true
}
},
setup(props) {
return () => (
<NDataTable
remote
striped
bordered
data={props.data}
columns={props.columns}
pagination={{ pageSize: 10 }}
/>
);
}
});
五、API服务层
// src/services/api.ts
import axios from 'axios';
const api = axios.create({
baseURL: import.meta.env.VITE_API_BASE
});
export default {
async fetchResource(resource: string) {
const { data } = await api.get(`/${resource}`);
return data;
},
async createItem(resource: string, payload: any) {
return await api.post(`/${resource}`, payload);
}
};
六、布局实现
// src/layouts/MainLayout.tsx
import { defineComponent } from 'vue';
import { NLayout, NLayoutSider, NLayoutContent, NMenu } from 'naive-ui';
import AppHeader from '@/components/AppHeader';
import { useRoute } from 'vue-router';
export default defineComponent({
setup() {
const route = useRoute();
const menuOptions = computed(() =>
route.matched.map(r => ({
label: r.meta.title,
key: r.path,
icon: r.meta.icon
}))
);
return () => (
<NLayout hasSider>
<NLayoutSider
bordered
collapseMode="width"
width={240}
nativeScrollbar={false}
>
<div class="logo">Admin</div>
<NMenu options={menuOptions.value} />
</NLayoutSider>
<NLayout>
<AppHeader />
<NLayoutContent contentStyle="padding: 24px;">
<router-view />
</NLayoutContent>
</NLayout>
</NLayout>
);
}
});
七、功能模块示例
// src/views/UserManagement.tsx
import { defineComponent, onMounted, ref } from 'vue';
import DataTable from '@/components/DataTable';
import api from '@/services/api';
export default defineComponent({
setup() {
const userData = ref([]);
const columns = [
{ title: 'ID', key: 'id' },
{ title: '用户名', key: 'username' },
{ title: '邮箱', key: 'email' },
{ title: '创建时间', key: 'createdAt' }
];
onMounted(async () => {
userData.value = await api.fetchResource('users');
});
return () => (
<div>
<h2>用户管理</h2>
<DataTable data={userData.value} columns={columns} />
</div>
);
}
});
八、优化建议
- 类型安全:
// src/types/data.d.ts
declare module '@/types' {
export interface User {
id: number;
username: string;
email: string;
createdAt: string;
}
}
- 响应式设计:
// 在布局组件中添加响应式处理
const screenWidth = ref(window.innerWidth);
window.addEventListener('resize', () => {
screenWidth.value = window.innerWidth;
});
- 权限控制:
// 路由守卫
router.beforeEach((to) => {
if (to.meta.requiresAuth && !store.state.user) {
return '/login';
}
});
九、开发规范
- 组件命名:
PascalCase(如UserManagement) - TSX文件后缀:
.tsx - 状态管理:Pinia 替代 Vuex
- 样式方案:SCSS + CSS Modules
十、运行配置
// package.json
"scripts": {
"dev": "vite",
"build": "vue-tsc --noEmit && vite build"
}
该模板特点:
- 🚀 基于 Composition API 的响应式架构
- 🔍 强类型约束贯穿整个项目
- 🧩 模块化设计便于功能扩展
- 📊 数据驱动视图渲染机制
- 🎨 Naive UI 主题可定制化
启动命令:
npm run dev
更多推荐
所有评论(0)