使用 Vue 3 + TypeScript + Vant 4 构建现代移动端应用

发布于:2025-03-10 ⋅ 阅读:(17) ⋅ 点赞:(0)

1. 引言

1.1 项目背景

随着移动互联网的发展,移动端应用的需求日益增长。Vue 3 提供了强大的响应式数据绑定和组件化开发能力,TypeScript 提供了类型安全,而 Vant 4 是一个轻量级、可靠的移动端 UI 库。本文将详细介绍如何使用 Vue 3 + TypeScript + Vant 4 构建现代移动端应用。

1.2 技术栈介绍

1.2.1 Vue 3

Vue 3 是 Vue.js 的最新版本,提供了更好的性能、更小的体积和更丰富的功能,如组合式 API、更好的 TypeScript 支持等。

1.2.2 TypeScript

TypeScript 是 JavaScript 的超集,提供了静态类型检查、类型推断等功能,有助于提高代码的可维护性和可读性。

1.2.3 Vant 4

Vant 4 是一个轻量级、可靠的移动端 UI 库,提供了丰富的组件和主题定制能力,适用于构建高性能的移动端应用。

2. 环境准备

2.1 安装 Node.js 和 npm

确保你的系统上安装了 Node.js 和 npm。可以通过以下命令检查是否已安装:

node -v
npm -v

2.2 创建 Vue 3 项目

使用 Vue CLI 创建一个新的 Vue 3 项目:

npm install -g @vue/cli
vue create my-mobile-app
cd my-mobile-app

在创建过程中选择 Vue 3 和 TypeScript 支持。

2.3 集成 TypeScript

在创建项目时选择 TypeScript 支持,Vue CLI 会自动配置 TypeScript。

2.4 安装 Vant 4

安装 Vant 4 及其 TypeScript 类型定义:

npm install vant@next
npm install @types/vant@next --save-dev

3. 项目结构

3.1 基本目录结构

my-mobile-app/
├── public/
│   ├── index.html
├── src/
│   ├── assets/
│   ├── components/
│   ├── router/
│   ├── store/
│   ├── views/
│   ├── App.vue
│   ├── main.ts
├── package.json
├── tsconfig.json
├── vue.config.js

3.2 主要文件介绍

  • public/index.html: 应用的入口 HTML 文件。
  • src/main.ts: 应用的入口文件,初始化 Vue 实例。
  • src/App.vue: 应用的根组件。
  • src/router/index.ts: 路由配置文件。
  • src/store/index.ts: 状态管理配置文件。
  • src/components/: 存放可复用的组件。
  • src/views/: 存放页面组件。

4. 基本配置

4.1 配置 TypeScript

确保 tsconfig.json 配置正确:

{
   
  "compilerOptions": {
   
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": [
      "webpack-env"
    ],
    "paths": {
   
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue"
  ],
  "exclude": [
    "node_modules"
  ]
}

4.2 配置 Vant 4

main.ts 中引入 Vant 4:

import {
    createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import Vant from 'vant';
import 'vant/lib/index.css';

const app = createApp(App);
app.use(router);
app.use(store);
app.use(Vant);
app.mount('#app');

4.3 配置路由

src/router/index.ts 中配置路由:

import {
    createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import Home from '../views/Home.vue';

const routes: Array<RouteRecordRaw> = [
  {
   
    path: '/',
    name: 'Home',
    component: Home
  },
  {
   
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue')
  }
];

const router = createRouter({
   
  history: createWebHistory(process.env.BASE_URL),
  routes
});

export default router;

4.4 配置状态管理 (Vuex)

src/store/index.ts 中配置 Vuex:

import {
    createStore } from 'vuex';

export default createStore({
   
  state: {
   
    count: 0
  },
  mutations: {
   
    increment(state) {
   
      state.count++;
    }
  },
  actions: {
   
    increment({
    commit }) {
   
      commit('increment');
    }
  },
  modules: {
   }
});

5. 组件开发

5.1 创建基础组件

src/components/ 目录下创建一个基础组件 HelloWorld.vue

<template>
  <div class="hello">
    <h1>{
  { msg }}</h1>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'HelloWorld',
  props: {
    msg: {
      type: String,
      required: true
    }
  }
});
</script>

<style scoped>
.hello {
  text-align: center;
}
</style>

5.2 使用 Vant 4 组件

src/views/Home.vue 中使用 Vant 4 组件:

<template>
  <div class="home">
    <van-button type="primary" @click="increment">Increment</van-button>
    <p>Count: {
  { count }}</p>
  </div>
</template>

<script lang="ts">
import { defineComponent, computed } from 'vue';
import { useStore } from 'vuex';

export default defineComponent({
  name: 'Home',
  setup() {
    const store = useStore();
    const count = computed(() => store.state.count);

    const increment = () => {
      store.dispatch('increment');
    };

    return {
      count,
      increment
    };
  }
});
</script>

<style scoped>
.home {
  text-align: center;
  margin-top: 60px;
}
</style>

5.3 自定义组件

src/components/ 目录下创建一个自定义组件 CustomButton.vue

<template>
  <van-button :type="type" @click="handleClick">
    <slot></slot>
  </van-button>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'CustomButton',
  props: {
    type: {
      type: String,
      default: 'default'
    }
  },
  emits: ['click'],
  setup(props, { emit }) {
    const handleClick = () => {
      emit('click');
    };

    return {
      handleClick
    };
  }
});
</script>

<style scoped>
.van-button {
  margin: 10px;
}
</style>

6. 样式管理

6.1 使用 CSS 预处理器 (Sass/SCSS)

src/assets/styles/ 目录下创建一个全局样式文件 _variables.scss

$primary-color: #1989fa;
$secondary-color: #64b587;

src/assets/styles/main.scss 中引入全局样式:

@import './variables.scss';

body {
  background-color: #f5f5f5;
  color: #333;
}

.van-button {
  background-color: $primary-color;
  border-color: $primary-color;
}

main.ts 中引入全局样式:

import {
    createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import Vant from 'vant';
import 'vant/lib/index.css';
import './assets/styles/main.scss';

const app = createApp(App);
app.use(router);
app.use(store);
app.use(Vant);
app.mount('#app');

6.2 使用 CSS 框架 (Vant 4 样式)

Vant 4 提供了丰富的样式和主题定制能力。确保在 main.ts 中引入 Vant 的样式文件:

import 'vant/lib/index.css'