Vue3 任务管理系统

只学语法不做项目,等于纸上谈兵。本系列要做一个"任务管理系统"(TaskHub):用户可以添加任务、标记完成、删除任务、按状态筛选,数据刷新后也不丢失。它规模适中,却覆盖了 Vue3 组件、响应式、计算属性、路由、状态管理与持久化等核心知识点,非常适合作为第一个完整实战项目。

系统要做什么

先想清楚需求,再写代码:

  • 添加任务:输入标题后回车或点击按钮新增;
  • 完成任务:勾选复选框切换完成状态;
  • 删除任务:一键移除不再需要的任务;
  • 筛选任务:按"全部 / 未完成 / 已完成"过滤;
  • 数据持久化:刷新页面后任务依然保留。

技术选型

技术作用
Vue3(组合式 API)编写界面与逻辑
Vite开发服务器与构建打包
Pinia全局状态管理
Vue Router页面路由跳转
localStorage本地数据持久化

页面结构

整个应用只有一个主页面(后续章节会加统计页),从上到下依次是输入区、任务列表、筛选栏:

+----------------------------------------------------+
|  输入框:__________  [添加任务]                       |
+----------------------------------------------------+
|  [x] 学习 Vue3 教程        [删除]                    |
|  [ ] 完成任务管理系统      [删除]                    |
+----------------------------------------------------+
|  全部(2)  未完成(1)  已完成(1)                       |
+----------------------------------------------------+

核心数据模型

一条任务就是一个普通对象:

const task = {
  id: 1,             // 唯一标识,供 v-for 的 key 使用
  title: '学习 Vue3', // 任务标题
  done: false         // 是否已完成
}

最小可运行版本

不引入任何库,先用 ref 实现添加与删除,感受"数据驱动视图":

<script setup>
import { ref } from 'vue'
const tasks = ref([])          // 任务数组
const title = ref('')          // 输入框内容
function addTask() {           // 添加任务
  if (!title.value.trim()) return
  tasks.value.push({ id: Date.now(), title: title.value, done: false })
  title.value = ''             // 清空输入框
}
function removeTask(id) {      // 删除任务
  tasks.value = tasks.value.filter(t => t.id !== id)
}
</script>
<template>
  <input v-model="title" placeholder="输入任务,回车添加"
         @keyup.enter="addTask" />
  <button @click="addTask">添加任务</button>
  <ul>
    <li v-for="t in tasks" :key="t.id">
      {{ t.title }} <button @click="removeTask(t.id)">删除</button>
    </li>
  </ul>
</template>

效果:输入内容回车后列表立即多出一行;点击删除,对应任务马上消失——我们只修改了数据,界面自动同步。

本系列的路线图

从搭环境到上线,一步步来:环境搭建 → 核心业务开发 → 组件拆分 → 状态管理与数据持久化 → 路由系统 → 逻辑复用与性能优化 → 项目部署。

小结

任务系统需求清晰、技术覆盖面广,是检验 Vue3 学习成果的绝佳载体。下一节先把开发环境搭起来。

笔记加载中…