完整的 Vue 2 + TypeScript + Vuex 的项目案例

下面是一个完整的 Vue 2 + TypeScript + Vuex 的项目案例。这个示例包括了基本的项目结构、Vuex 模块、组件和路由配置。

项目结构

src/

├── assets/

├── components/

│ └── Counter.vue

├── router/

│ └── index.ts

├── store/

│ ├── index.ts

│ └── modules/

│ └── counter.ts

├── App.vue

└── main.ts

  1. 安装依赖

首先确保安装了必要的依赖:

bash 复制代码
npm install vue vuex vue-router @types/node typescript ts-loader
  1. 配置 tsconfig.json

在项目根目录下创建 tsconfig.json 文件

javascript 复制代码
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    },
    "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
  "exclude": ["node_modules"]
}
  1. 配置 main.ts

在 src/main.ts 中配置 Vue 应用:

TypeScript 复制代码
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app');
  1. 配置 Vuex 存储

在 src/store/index.ts 中配置 Vuex 存储:

TypeScript 复制代码
import Vue from 'vue';
import Vuex from 'vuex';
import counter from './modules/counter';

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    counter,
  },
});

在 src/store/modules/counter.ts 中定义 counter 模块:

TypeScript 复制代码
import { Module, ActionContext } from 'vuex';

interface State {
  count: number;
}

const counter: Module<State, any> = {
  state: (): State => ({
    count: 0,
  }),
  mutations: {
    increment(state: State) {
      state.count++;
      console.log('increment:', state.count);
    },
  },
  getters: {
    doubleCount: (state: State) => state.count * 2,
  },
  actions: {
    asyncIncrement({ commit }: ActionContext<State, any>) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    },
  },
};

export default counter;
  1. 配置路由

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

TypeScript 复制代码
import Vue from 'vue';
import VueRouter from 'vue-router';
import Counter from '../components/Counter.vue';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'Counter',
    component: Counter,
  },
];

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes,
});

export default router;
  1. 创建组件

在 src/components/Counter.vue 中创建 Counter 组件:

TypeScript 复制代码
<template>
  <div>
    <h1>Counter</h1>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">Increment</button>
    <button @click="asyncIncrement">Async Increment</button>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import { mapState, mapGetters, mapActions } from 'vuex';

@Component({
  computed: {
    ...mapState(['count']),
    ...mapGetters(['doubleCount']),
  },
  methods: {
    ...mapActions(['increment', 'asyncIncrement']),
  },
})
export default class Counter extends Vue {}
</script>

<style scoped>
button {
  margin: 5px;
}
</style>
  1. 创建 App.vue

在 src/App.vue 中创建主应用组件:

TypeScript 复制代码
<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';

@Component
export default class App extends Vue {}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
  1. 运行项目

最后,运行项目:

bash 复制代码
npm run serve

这个示例展示了如何在 Vue 2 项目中使用 TypeScript 和 Vuex。你可以根据需要扩展和修改这个基础结构。

相关推荐
陈随易4 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
福兮说5 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
传人once7 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.467 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
库拉镜像AI牛牛9 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔9 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师9 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔9 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina369 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf
光影少年9 小时前
Taro 是如何解析入口配置 app.config.ts 和页面配置的?
微信小程序·小程序·typescript·reactjs·百度小程序·taro