基于 Vue 3 + TypeScript + TSX + Naive UI 的数据渲染后台管理系统模板开发方案:

一、技术栈配置

  1. 项目初始化
npm create vue@latest my-admin -- --tsx --router --pinia
cd my-admin
npm install naive-ui @vicons/ionicons5
  1. 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>
    );
  }
});

八、优化建议

  1. 类型安全
// src/types/data.d.ts
declare module '@/types' {
  export interface User {
    id: number;
    username: string;
    email: string;
    createdAt: string;
  }
}
  1. 响应式设计
// 在布局组件中添加响应式处理
const screenWidth = ref(window.innerWidth);
window.addEventListener('resize', () => {
  screenWidth.value = window.innerWidth;
});
  1. 权限控制
// 路由守卫
router.beforeEach((to) => {
  if (to.meta.requiresAuth && !store.state.user) {
    return '/login';
  }
});

九、开发规范

  1. 组件命名:PascalCase (如 UserManagement)
  2. TSX文件后缀:.tsx
  3. 状态管理:Pinia 替代 Vuex
  4. 样式方案:SCSS + CSS Modules

十、运行配置

// package.json
"scripts": {
  "dev": "vite",
  "build": "vue-tsc --noEmit && vite build"
}

该模板特点:

  • 🚀 基于 Composition API 的响应式架构
  • 🔍 强类型约束贯穿整个项目
  • 🧩 模块化设计便于功能扩展
  • 📊 数据驱动视图渲染机制
  • 🎨 Naive UI 主题可定制化

启动命令:

npm run dev
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐