Vant4 + Vue3 + Axios 的移动端框架

以下是基于 Vant4 + Vue3 + Axios 的移动端框架搭建方案,整合了 项目初始化、组件库配置、请求封装、状态管理 等核心模块,并参考了多个最佳实践。


一、项目初始化

1. 创建Vite项目(TypeScript支持)

npm create vite@latest my-vant-app --template vue-ts
cd my-vant-app

2. 安装核心依赖

npm install vant@4.x axios pinia vue-router@4 sass

二、Vant4 组件库配置

1. 按需引入组件(推荐)

通过 unplugin-vue-components 自动按需引入,避免打包体积过大:

npm install unplugin-vue-components -D

vite.config.ts 中配置:

import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';

export default defineConfig({
  plugins: [
    Components({
      resolvers: [VantResolver()],
    }),
  ],
});

2. 全局样式适配(vw单位)

安装 postcss-px-to-viewport-8-plugin 适配移动端:

npm install postcss-px-to-viewport-8-plugin -D

配置 postcss.config.js

module.exports = {
  plugins: {
    'postcss-px-to-viewport-8-plugin': {
      viewportWidth: 375, // 设计稿宽度
    },
  },
};

三、Axios 封装与拦截器

1. 创建Axios实例

// src/utils/request.ts
import axios from 'axios';
import { showToast } from 'vant';

const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,
});

// 请求拦截器
service.interceptors.request.use((config) => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    if (response.data.code !== 200) {
      showToast(response.data.message || '请求失败');
      return Promise.reject(response.data);
    }
    return response.data;
  },
  (error) => {
    showToast(error.response?.data?.message || '网络错误');
    return Promise.reject(error);
  }
);

export default service;

2. API模块化示例

// src/api/user.ts
import request from '@/utils/request';

export const login = (data: { username: string; password: string }) => {
  return request.post('/auth/login', data);
};

四、状态管理(Pinia)

1. 创建Pinia Store

// src/stores/user.ts
import { defineStore } from 'pinia';

interface UserState {
  token: string | null;
  userInfo: Record<string, any>;
}

export const useUserStore = defineStore('user', {
  state: (): UserState => ({
    token: localStorage.getItem('token'),
    userInfo: {},
  }),
  actions: {
    setToken(token: string) {
      this.token = token;
      localStorage.setItem('token', token);
    },
    async login(params: { username: string; password: string }) {
      const res = await login(params);
      this.setToken(res.data.token);
    },
  },
});

2. 在组件中使用

<script setup>
import { useUserStore } from '@/stores/user';

const userStore = useUserStore();
const handleLogin = () => {
  userStore.login({ username: 'admin', password: '123456' });
};
</script>

五、路由与权限控制

1. 路由配置

// src/router.ts
import { createRouter, createWebHistory } from 'vue-router';

const routes = [
  {
    path: '/login',
    component: () => import('@/views/Login.vue'),
  },
  {
    path: '/home',
    component: () => import('@/views/Home.vue'),
    meta: { requiresAuth: true },
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 权限拦截
router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !localStorage.getItem('token')) {
    next('/login');
  } else {
    next();
  }
});

export default router;

六、移动端适配补充

  1. 禁止缩放:在 index.html 中添加:

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  2. 深色模式:Vant4 内置支持,通过 CSS 变量切换主题。


七、项目结构参考

src/
├── api/            # 接口模块
├── assets/         # 静态资源
├── components/     # 公共组件
├── stores/         # Pinia状态
├── utils/          # 工具类(axios封装)
├── views/          # 页面组件
├── App.vue
└── main.ts

总结

  • 核心优势:Vant4 提供丰富的移动端组件,Axios 拦截器实现统一错误处理,Pinia 简化状态管理。

  • 扩展方向:可集成国际化(i18n)、Mock 数据、性能监控(如 Sentry)。


Vant4 + Vue3 + Axios 的移动端框架
https://uniomo.com/archives/vant4-vue3-axios-de-yi-dong-duan-kuang-jia
作者
雨落秋垣
发布于
2025年09月07日
许可协议