当前位置: 首页 > news >正文

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | TodoList(代办事项组件)

📅 我们继续 50 个小项目挑战!—— TodoList组件

仓库地址:https://github.com/SunACong/50-vue-projects

项目预览地址:https://50-vue-projects.vercel.app/

在这里插入图片描述


使用 Vue 3 的组合式 API (<script setup>) 和一些基础的 Tailwind CSS 来创建一个功能齐全的待办事项(To-Do)应用。这个应用包括添加新任务、标记任务为完成状态以及删除任务的功能,并且所有的数据都会被保存到用户的 localStorage 中,以便在页面刷新后仍然保留。


🎯 应用目标

我们的目标是创建一个轻量级但功能完整的待办事项管理器,用户可以:

  • 添加新的待办事项
  • 标记待办事项为完成或未完成
  • 右键点击待办事项以删除它
  • 确保数据在页面刷新后依然存在

🔧 技术实现点

💻关键技术与概念

技术/概念描述
<script setup>Vue 3 提供的一种更简洁的语法糖来编写组件逻辑
ref用于定义响应式变量
watch监听响应式数据的变化并执行相应的回调函数
onMounted生命周期钩子,在组件挂载完成后调用
localStorage浏览器提供的持久化存储API,用于保存数据即使浏览器关闭后依旧可用
Tailwind CSS一种实用优先的CSS框架,通过类名快速构建UI

主要功能

  1. 数据持久化:通过 localStorage 实现待办事项的持久化存储。
  2. 响应式数据处理:利用 Vue 3 的 ref 实现对数据的响应式管理。
  3. 交互设计
    • 左键点击某项待办事项可切换其完成状态。
    • 右键点击某项待办事项可将其删除。
  4. 样式设计:使用 Tailwind CSS 快速搭建美观且响应式的界面。

🖌️ 组件实现

💻 模板结构 <template>

<template><div class="font-poppins flex min-h-screen flex-col items-center justify-center bg-gray-100 p-4 text-gray-800"><h1 class="mb-6 text-center text-[clamp(5rem,15vw,10rem)] font-light text-purple-400 opacity-40">todos</h1><form @submit.prevent="addTodo" class="w-full max-w-md shadow-lg"><input v-model="newTodoText" type="text" placeholder="Enter your todo" autocomplete="off" class="w-full border-none p-4 text-2xl focus:ring-2 focus:ring-purple-400 focus:outline-none" /><ul class="divide-y divide-gray-100 bg-white"><li v-for="(todo, index) in todos" :key="index" @click="toggleTodo(index)" @contextmenu.prevent="deleteTodo(index)" class="cursor-pointer p-4 text-xl transition-colors hover:bg-gray-50" :class="{ 'text-gray-400 line-through': todo.completed }">{{ todo.text }}</li></ul></form><small class="mt-8 text-center text-gray-500">Left click to toggle completed.<br />Right click to delete todo</small></div>
</template>
💡 解析
  • 标题部分: 利用 clamp() 函数确保标题大小根据屏幕宽度自适应调整,同时给用户提供视觉上的吸引力。
  • 表单输入: 输入框绑定 v-modelnewTodoText,允许用户输入新的待办事项。通过 @submit.prevent 阻止默认提交行为并触发 addTodo 方法。
  • 列表展示: 使用 v-for 渲染每个待办事项,提供点击事件来切换完成状态和右键菜单来删除项目。对于已完成的任务,通过条件类改变文本颜色和添加删除线。
  • 提示信息: 小字提示告知用户交互方式。

💻 脚本逻辑 <script setup>

<script setup>
import { ref, watch, onMounted } from 'vue'// 响应式数据
const newTodoText = ref('')
const todos = ref([])// 从localStorage加载待办事项
onMounted(() => {const savedTodos = localStorage.getItem('todos')if (savedTodos) {todos.value = JSON.parse(savedTodos)}
})// 添加待办事项
const addTodo = () => {if (newTodoText.value.trim()) {todos.value.push({text: newTodoText.value.trim(),completed: false,})newTodoText.value = ''}
}// 切换待办事项完成状态
const toggleTodo = (index) => {todos.value[index].completed = !todos.value[index].completed
}// 删除待办事项
const deleteTodo = (index) => {todos.value.splice(index, 1)
}// 监听todos变化,保存到localStorage
watch(todos, (newTodos) => {localStorage.setItem('todos', JSON.stringify(newTodos))
}, { deep: true })
</script>
💡 解析
  • 初始化数据: 使用 ref 定义 newTodoTexttodos,分别代表新输入的待办事项文本和当前所有待办事项列表。
  • 加载已有数据: 在组件挂载时,尝试从 localStorage 加载之前保存的待办事项。
  • 操作方法:
    • addTodo: 当用户提交新待办事项时,检查非空后添加至列表,并清空输入框。
    • toggleTodo: 切换指定索引处待办事项的完成状态。
    • deleteTodo: 从列表中移除指定索引处的待办事项。
  • 监听数据变更: 使用 watch 监听 todos 的任何更改,并将更新后的数据同步回 localStorage,保证数据持久性。

📁 常量定义 + 组件路由

constants/index.js 添加组件预览常量:

{id: 49,title: 'TodoList',image: 'https://50projects50days.com/img/projects-img/49-todo-list.png',link: 'TodoList',},

router/index.js 中添加路由选项:

{path: '/TodoList',name: 'TodoList',component: () => import('@/projects/TodoList.vue'),},

🏁 总结

实现了一个基本的待办事项应用,但你仍有许多优化空间:

  1. 提高用户体验:例如,可以增加动画效果来提升交互体验,或者引入拖拽排序功能让用户能够更灵活地管理他们的待办事项。
  2. 增强数据安全性:考虑到 localStorage 存储的数据容易被清除或篡改,考虑采用更安全的数据存储方案如 IndexedDB 或者结合后端服务进行数据管理。
  3. 支持更多功能:比如设置待办事项的截止日期、分类标签等高级特性,使应用更加实用。

总之,这是一个非常基础但全面的示例,展示了如何希望这能激发你进一步探索 Vue.js 的强大功能,并开发出更多令人兴奋的应用程序!


👉 下一篇,我们将完成InsectCatchGame组件,一个很恶心的昆虫捕捉游戏。🚀

感谢阅读,欢迎点赞、收藏和分享 😊

http://www.lryc.cn/news/608644.html

相关文章:

  • 子区间问题
  • 主机序列号的修改方法与原理
  • Azure DevOps 中的代理
  • 渗透作业4
  • LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
  • webrtc弱网-QualityScaler 源码分析与算法原理
  • PLC传感器接线与输出信号接线
  • WSUS服务器数据库维护与性能优化技术白皮书
  • 力扣 hot100 Day64
  • 六、Linux核心服务与包管理
  • 若没有安全可靠性保障,对于工程应用而言,AI或许就是大玩具吗?
  • Python黑科技:用@property优雅管理你的属性访问
  • ThinkPHP5x,struts2等框架靶场复现
  • 控制建模matlab练习10:滞后补偿器
  • 吴恩达【prompt提示词工程】学习笔记
  • MCP革命:Anthropic如何重新定义AI与外部世界的连接标准
  • 2.4.1-2.4.3控制范围-控制进度-控制成本
  • STM32复位电路解析
  • Rustdesk中继服务器搭建(windows 服务器)
  • 蜂群优化算法:智能优化新突破
  • 联想笔记本安装系统之后一直转圈圈的问题了?无法正常进入到系统配置界面,原来是BIOS中的VMD问题
  • VUE2 学习笔记16 插槽、Vuex
  • 09.Redis 常用命令
  • C++23 Concepts:用类型约束重构泛型编程的终极方案
  • 选择排序原理与C语言实现详解
  • redis的Java客户端(SpringDataRedis)
  • 深入掌握 ExcelJS:Node.js 中强大的 Excel 操作库
  • 2、docker容器命令 | 信息查看
  • 关于Web前端安全之XSS攻击防御增强方法
  • RAG-Semantic Chunking