Vue-Todo-list 案例
一、前言
在前端开发中,Todo List(待办事项列表) 是一个非常经典的入门项目。它涵盖了组件化思想、数据绑定、事件处理、本地存储等核心知识点,非常适合用来练习 Vue 的基本用法。
本文将带你一步步实现一个功能完整的 Vue Todo List 应用,包括:
- 添加任务
- 删除任务
- 标记任务完成状态
- 清除已完成任务
- 使用
localStorage
保存数据
通过本案例,你将掌握 Vue 开发的基本流程与常用技巧,为后续开发更复杂的项目打下坚实基础。
二、项目目标
我们要实现一个如下功能的 Todo List:
功能 | 描述 |
---|---|
添加任务 | 输入内容后点击“添加”按钮或按回车键新增任务 |
删除任务 | 点击任务右侧的删除按钮即可移除该任务 |
完成状态切换 | 点击任务文本可切换完成状态(划线显示) |
显示任务总数 | 显示当前任务总数 |
显示未完成数 | 显示未完成的任务数量 |
清除已完成任务 | 可一键清除所有已完成的任务 |
数据持久化 | 使用 localStorage 保存数据,刷新页面不丢失 |
三、技术选型
- Vue 3(支持 Composition API)
- Vue CLI 脚手架初始化项目
<script setup>
语法糖(更简洁)- HTML + CSS 布局
localStorage
实现数据持久化
四、项目结构说明
vue-todo/
├── public/ # 静态资源(不参与构建)
├── src/
│ ├── App.vue # 根组件
│ ├── main.js # 入口文件
│ └── components/
│ └── TodoList.vue # 待办事项主组件
├── package.json
└── README.md
五、开发步骤详解
第一步:创建 Vue 项目
如果你还没有创建项目,可以通过 Vue CLI 快速搭建:
vue create vue-todo
cd vue-todo
npm run serve
选择默认配置即可。
第二步:创建 TodoList 组件
1. 创建组件文件
在 src/components/TodoList.vue
中创建组件。
<template><div class="todo-container"><h2>我的待办事项</h2><!-- 添加任务 --><div class="input-group"><inputv-model="newTodo"@keyup.enter="addTodo"placeholder="输入新任务..."class="todo-input"/><button @click="addTodo" class="btn">添加</button></div><!-- 任务列表 --><ul class="todo-list"><liv-for="(todo, index) in todos":key="todo.id":class="{ completed: todo.completed }"@click="toggleComplete(index)"class="todo-item">{{ todo.text }}<button @click.stop="removeTodo(index)" class="delete-btn">删除</button></li></ul><!-- 操作按钮 --><div class="actions"><p>共 {{ todos.length }} 项任务,还有 {{ remainingCount }} 项未完成</p><button @click="clearCompleted" class="btn">清除已完成</button></div></div>
</template><script setup>
import { ref, computed, watchEffect } from 'vue'// 初始化任务数组
const todos = ref(loadFromLocalStorage())// 新增任务
const newTodo = ref('')
function addTodo() {const text = newTodo.value.trim()if (text === '') returntodos.value.push({id: Date.now(),text,completed: false})newTodo.value = ''
}// 切换完成状态
function toggleComplete(index) {todos.value[index].completed = !todos.value[index].completed
}// 删除任务
function removeTodo(index) {todos.value.splice(index, 1)
}// 清除已完成任务
function clearCompleted() {todos.value = todos.value.filter(todo => !todo.completed)
}// 计算未完成任务数
const remainingCount = computed(() => {return todos.value.filter(todo => !todo.completed).length
})// 监听数据变化并保存到 localStorage
watchEffect(() => {saveToLocalStorage(todos.value)
})// 本地存储方法
function saveToLocalStorage(data) {localStorage.setItem('todos', JSON.stringify(data))
}
function loadFromLocalStorage() {const data = localStorage.getItem('todos')return data ? JSON.parse(data) : []
}
</script><style scoped>
.todo-container {max-width: 500px;margin: 0 auto;padding: 20px;border: 1px solid #ccc;border-radius: 8px;font-family: Arial;
}.input-group {display: flex;gap: 10px;margin-bottom: 20px;
}.todo-input {flex: 1;padding: 8px;font-size: 16px;
}.btn {padding: 8px 12px;background-color: #42b983;color: white;border: none;cursor: pointer;border-radius: 4px;
}.todo-list {list-style: none;padding-left: 0;
}.todo-item {padding: 10px;margin-bottom: 10px;border: 1px solid #ddd;border-radius: 4px;cursor: pointer;position: relative;
}.todo-item:hover .delete-btn {display: inline-block;
}.todo-item.completed {text-decoration: line-through;color: gray;
}.delete-btn {position: absolute;right: 10px;top: 10px;display: none;background-color: #e74c3c;
}.actions {margin-top: 20px;
}
</style>
第三步:在 App.vue 中引入组件
<template><div id="app"><TodoList /></div>
</template><script setup>
import TodoList from './components/TodoList.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>
六、运行效果预览
启动项目:
npm run serve
打开浏览器访问 http://localhost:8080
,你会看到一个美观且功能齐全的待办事项列表。
你可以:
- 输入任务并按下回车或点击“添加”;
- 点击任务条目切换完成状态;
- 点击“删除”按钮删除任务;
- 点击“清除已完成”按钮一键清理已完成任务;
- 刷新页面后任务不会丢失。
七、功能扩展建议(进阶)
功能 | 实现建议 |
---|---|
支持编辑任务 | 在任务条目上添加“编辑”按钮,允许修改文本内容 |
支持任务分类 | 添加标签或分类字段,如“工作”、“生活”等 |
使用 Vuex/Pinia | 将状态管理抽离出来,便于大型项目维护 |
支持多人协作 | 结合 WebSocket 或 Firebase 实现实时同步 |
支持拖拽排序 | 使用第三方库如 SortableJS |
移动端适配 | 使用响应式布局优化手机端体验 |
八、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!
相关文章:
Vue-Todo-list 案例
一、前言 在前端开发中,Todo List(待办事项列表) 是一个非常经典的入门项目。它涵盖了组件化思想、数据绑定、事件处理、本地存储等核心知识点,非常适合用来练习 Vue 的基本用法。 本文将带你一步步实现一个功能完整的 Vue Todo…...

GIC700概述
GIC-700是用于处理外设与处理器核之间,以及核与核之间中断的通用中断控制器。GIC-700支持分布式微体系结构,其中包含用于提供灵活GIC实现的几个独立块。 GIC700支持GICv3、GICv3.1、GICv4.1架构。 该微体系结构规模可从单核到互联多chip环境࿰…...
动静态库的使用(Linux)
1.库 通俗来说,库就是现有的,可复用的代码,例如:在C/C语言编译时,就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...
Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析
你可能会认为:用了跨平台框架(如 Flutter 或 React Native),开发效率提高了,发布流程也该更轻松才对。 但当我第一次要将一个 Flutter 项目发布到 App Store 时,现实给了我一巴掌: “没有 Mac&…...

统信桌面专业版如何使用python开发平台jupyter
哈喽呀,小伙伴们 最近有学员想了解在统信UOS桌面专业版系统上开发python程序,Anaconda作为python开发平台,anaconda提供图形开发平台,提供大量的开发插件和管理各种插件的平台,但是存在版权问题,有没有其他工具可以替代Anaconda呢…...
移除元素-JavaScript【算法学习day.04】
题目链接:27. 移除元素 - 力扣(LeetCode) 第一种思路 标签:拷贝覆盖 主要思路是遍历数组 nums,每次取出的数字变量为 num,同时设置一个下标 ans 在遍历过程中如果出现数字与需要移除的值不相同时ÿ…...
Android 相对布局管理器(RelativeLayout)
俩重要属性 android:gravity android:ignoreGravity Android 相对布局管理器:自由排列的魔法布局 想象一下,你是一个室内设计师,需要在一个房间里摆放家具。RelativeLayout(相对布局)就像是一个 "自由摆放"…...
DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎
DuckDB 是一款令人兴奋的内嵌式分析型数据库 (OLAP),它为本地数据分析和处理带来了前所未有的便捷与高效 🚀。它无需外部服务器,可以直接在应用程序进程中运行,并提供了强大的 SQL 支持和列式存储带来的高性能。 什么是 DuckDB&am…...

什么是预训练?深入解读大模型AI的“高考集训”
1. 预训练的通俗理解:AI的“高考集训” 我们可以将预训练(Pre-training) 形象地理解为大模型AI的“高考集训”。就像学霸在高考前需要刷五年高考三年模拟一样,大模型在正式诞生前,也要经历一场声势浩大的“题海战术”…...

鸿蒙仓颉语言开发实战教程:购物车页面
大家上午好,仓颉语言商城应用的开发进程已经过半,不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面: 看到这个页面,我们首先要对它简单的分析一下。这个页面一共分为三部分,分别是…...

OPENCV的AT函数
一.AT函数介绍 在 OpenCV 中,at() 是一个模板成员函数,用于访问和修改矩阵或图像中特定位置的元素。它提供了一种直接且类型安全的方式来操作单个像素值,但需要注意其性能和类型匹配问题 AT函数是OPENCV中重要的函数…...
【走好求职第一步】求职OMG——见面课测验4
2025最新版!!!6.8截至答题,大家注意呀!博主码字不易点个关注吧~~ 1.单选题(2分) 下列不属于简历撰写技巧原则的是( A ) A.具体性 B.相关性 C.匹配性 2.单选题(2分) 笔试的下一步一般是:( B &…...

ISO 17387——解读自动驾驶相关标准法规(LCDAS)
Intelligent transport systems — Lane change decision aid systems (LCDAS) — Performance requirements and test procedures(First edition: 2008-05-01) 原文链接:https://cdn.standards.iteh.ai/samples/43654/701fd49bde7b4d3db165444b7c6f0c53/ISO-17387…...

智慧零售管理中的客流统计与属性分析
智慧零售管理中的视觉分析技术应用 一、背景与需求 随着智慧零售的快速发展,传统零售门店面临管理效率低、安全风险高、客户体验差等问题。通过视觉分析技术,智慧零售管理系统可实现对门店内人员行为的实时监控与数据分析,从而提升运营效率…...

Ps:Adobe PDF 预设
Ps菜单:编辑/Adobe PDF 预设 Edit/Adobe PDF Presets 通过“Adobe PDF 预设” Adobe PDF Presets对话框,可以查看 Adobe PDF 预设,了解复杂的 PDF 设置。还可以编辑、新建、删除、载入预设,根据最终用途(如高质量打印、…...
Python Excel 文件处理:openpyxl 与 pandas 库完全指南
在数据处理和分析过程中,Excel 文件是最常见的数据存储格式之一。Python 提供了多个库来处理 Excel 文件,其中 openpyxl 和 pandas 是最常用的两个库。它们各自有独特的优势,适用于不同的需求。本文将详细介绍如何使用这两个库来处理 Excel 文…...
九、【ESP32开发全栈指南: UDP通信服务端】
一、TCP与UDP核心差异 特性TCPUDP连接方式面向连接 (需三次握手)无连接可靠性可靠传输 (重传/排序/校验)尽力交付 (不保证可靠性)实时性延迟较高低延迟,实时性强传输效率协议开销大头部开销小 (仅8字节)连接类型点对点支持广播/多播资源占用高 (需维护连接状态)极低…...

靶场(二十)---靶场体会小白心得 ---jacko
老样子开局先看端口,先看http端口 PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 |_http-title: H2 Database Engine (redirect) | http-methods: |_ Potentially risky methods: TRACE |_http-server-header:…...
【EasyExcel】导出时添加页眉页脚
一、需求 使用 EasyExcel 导出时添加页眉页脚 二、添加页眉页脚的方法 通过配置WriteSheet或WriteTable对象来添加页眉和页脚。以下是具体实现步骤: 1. 创建自定义页眉页脚实现类 public class CustomFooterHandler implements SheetWriteHandler {private final…...

高频通信与航天电子的材料革命:猎板PCB高端压合基材技术解析
—聚酰亚胺/陶瓷基板在5G与航天场景的产业化应用 一、极端环境材料体系:突破温域与频率极限 聚酰亚胺基板(PI)的航天级稳定性 猎板在卫星通信PCB中采用真空层压工艺处理聚酰亚胺基材(Dk≈10.2)&a…...
如何区分 “通信网络安全防护” 与 “信息安全” 的考核重点?
“通信网络安全防护” 与 “信息安全” 的考核重点可以从以下几个方面进行区分: 保护对象 通信网络安全防护:重点关注通信网络系统本身,包括网络基础设施,如路由器、交换机、基站等,以及网络通信链路和相关设备。同…...
Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景 引言 在 Java 集合框架体系中,ArrayList、Vector和LinkedList作为List接口的三大经典实现类,共同承载着列表数据的存储与操作功能。然而,由于底层数据结构设计、线程安全机制以…...

WPF技术体系与现代化样式
目录 1 WPF技术架构解析 1.1 技术演进与定位 1.2 核心机制对比 2 样式与资源系统 2.1 资源(Resource)定义与作用域 2.2 样式(Style)与触发器 3 开发环境配置(.NET 8) 3.1 安装流程 3.2 项目结…...
Redis 与 MySQL 数据一致性保障方案
在高并发场景下,Redis 作为缓存中间件与 MySQL 数据库配合使用时,数据一致性是一个关键挑战。本文将详细探讨如何保障 Redis 与 MySQL 的数据一致性,并结合 Java 代码实现具体方案。 数据不一致的原因分析 在分布式系统中,Redis…...
Sentry 接口返回 Status Code 429 Too Many Requests
Sentry 是一个 开源的错误追踪(Error Tracking)平台,主要用于实时捕获和监控应用程序中的异常、错误日志,并帮助开发者快速定位问题根源。 📌 Sentry 的核心功能 自动捕获异常 自动捕捉 JavaScript、Vue、React、Node.…...
数学建模期末速成 聚类分析与判别分析
聚类分析是在不知道有多少类别的前提下,建立某种规则对样本或变量进行分类。判别分析是已知类别,在已知训练样本的前提下,利用训练样本得到判别函数,然后对未知类别的测试样本判别其类别。 聚类分析 根据样本自身的属性…...

【工具教程】PDF电子发票提取明细导出Excel表格,OFD电子发票行程单提取保存表格,具体操作流程
在企业财务管理领域,电子发票提取明细导出表格是不可或缺的工具。 月末财务结算时,财务人员需处理成百上千张电子发票,将发票明细导出为表格后,通过表格强大的数据处理功能,可自动分类汇总不同项目的支出金额ÿ…...

基于STM32的DHT11温湿度远程监测LCD1602显示Proteus仿真+程序+设计报告+讲解视频
DHT11温湿度远程监测proteus仿真 1. 主要功能2.仿真3. 程序4. 设计报告5. 资料清单&下载链接 基于STM32的DHT11温湿度远程监测LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C…...

分类预测 | Matlab实现CNN-BiLSTM-Attention高光谱数据分类预测
分类预测 | Matlab实现CNN-BiLSTM-Attention高光谱数据分类预测 目录 分类预测 | Matlab实现CNN-BiLSTM-Attention高光谱数据分类预测分类效果功能概述程序设计参考资料 分类效果 功能概述 该MATLAB代码实现了一个结合CNN、BiLSTM和注意力机制的高光谱数据分类预测模型&#x…...

微软推出SQL Server 2025技术预览版,深化人工智能应用集成
在Build 2025 大会上,微软向开发者社区开放了SQL Server 2025的测试版本。该版本的技术改进主要涵盖人工智能功能集成、系统性能优化与开发工具链升级三个维度,展示了数据库管理系统在智能化演进方向上的重要进展。 智能数据处理功能更新 新版本的技术亮…...