基于Vue组件实现TodoList
创作时间:
作者:
@小白创作中心
基于Vue组件实现TodoList
引用
CSDN
1.
https://blog.csdn.net/qq_52764447/article/details/121685792
本文将详细介绍如何使用Vue组件实现一个功能完整的TodoList应用。通过本教程,你将学习到Vue组件的创建、数据传递、事件处理等核心概念,并掌握如何构建一个实用的待办事项列表应用。
功能概述
- 将已有的任务渲染到页面
- 在输入框中输入内容后按enter键,即可把内容添加到下面的列表中(如果内容为空则不添加)
- 动态计算有几个已完成的任务以及所有的任务
- 点击复选框,实现选中或不选中效果(即完成或未完成)
- 删除单个任务以及删除已完成任务
下面这个图展示了组件的结构:
功能实现
功能一:将已有的任务渲染到页面
数据存储在父组件App中,通过v-for指令将数据渲染到页面。
UserList组件
<template>
<ul class="todo-main">
<UserItem v-for="todoObj in todos" :key="todoObj.id" :todo="todoObj" >
</ul>
</template>
<script>
import UserItem from "./UserItem.vue";
export default {
name: "UserList",
components: { UserItem },
props: ["todos", "checktodo", "deletetodo"],
};
</script>
UserItem组件
<template>
<li>
<label>
<input
type="checkbox"
:checked="todo.done"
/>
<span>{{ todo.title }}</span>
</label>
<button class="btn btn-danger"">删除</button>
</li>
</template>
<script>
export default {
name: "UserItem",
props: ["todo"]
};
</script>
功能二:在输入框中输入内容后按enter键添加任务
在UserHeader组件中为表单绑定回车事件,通过props实现子组件向父组件传递数据。
UserHeader组件
<input
type="text"
placeholder="请输入你的任务名称,按回车键确认"
@keyup.enter="add"
v-model="title"
/>
App组件
<UserHeader :addtodo="addtodo" />
methods: {
addtodo(todoObj) {
this.todos.unshift(todoObj);
}
}
UserHeader子组件
props: ["addtodo"],
methods: {
add() {
if (!this.title.trim()) {
alert("数据不能为空");
}
const todoObj = { id: nanoid(), title: this.title, done: false };
this.addtodo(todoObj);
this.title = " ";
}
}
功能三:动态计算任务状态
在UserFooter组件中通过计算属性计算已完成和总任务数。
计算方法
computed: {
doneTotal() {
return this.todos.reduce((pre, todo) => pre + (todo.done ? 1 : 0), 0);
},
total() {
return this.todos.length;
}
}
功能四:任务完成状态切换
通过双向绑定实现复选框的选中状态切换。
UserItem组件
<script>
export default {
name: "UserItem",
props: ["todo", "checktodo"],
methods: {
handlechack(id) {
this.checktodo(id);
}
}
}
</script>
App组件
methods: {
checktodo(id) {
this.todos.forEach((todo) => {
if (todo.id === id) {
todo.done = !todo.done;
}
});
}
}
功能五:任务删除
支持删除单个任务和删除所有已完成任务。
App组件
methods: {
deletetodo(id) {
this.todos = this.todos.filter((todo) => todo.id !== id);
},
clearAlltodo() {
this.todos = this.todos.filter((todo) => !todo.done);
}
}
UserItem组件
<template>
<button class="btn btn-danger" @click="handleDelete(todo.id)">删除</button>
</template>
<script>
export default {
name: "UserItem",
props: ["deletetodo"],
methods: {
handleDelete(id) {
if (confirm("确定删除吗? ")) {
this.deletetodo(id);
}
}
}
}
</script>
总结
以上就是基于Vue组件实现的一个TodoList案例。虽然代码不完全展示,但每个功能都进行了详细的分析,相信读者能够根据这些内容构建出一个完整的TodoList应用。
热门推荐
肚子疼时别慌!掌握这些自我缓解技巧,舒缓不适一点也不难
“解密”好莱坞各工种收入
交通事故和解协议书怎么写才有效
电工必修课:电气图纸全面解读指南
毛肚和百叶的区别:从部位、功能到吃法的全面解析
怎样评估自身的身高增长潜力
Cell:你的身高谁做主?揭示身高遗传模式的新发现
如何保养珍珠项链?8个秘诀让你的珍珠项链光洁如初!
选择过多也是种负担——正确应对决策疲劳
B站播放量怎么刷?揭秘提升播放量的有效策略
刚出生的狗应该取什么名字?如何为小狗选择合适的名字?
手机摄影夜景技巧:三步拍出专业级夜景大片
骨量减少什么意思
太阳核心是固体的吗?什么物体在1500万℃高温下,仍然不会熔化?
鸿蒙系统如何禁止系统升级提示
治愈心灵创伤:自我关怀的力量
书荒必读,量大且口碑绝佳的小说22本,有玄幻、科幻、历史、都市
零线火线接好了还是不亮?这些电路故障排查方法请收好
教育焦虑下的补课热:家庭情感的挑战与应对
“宁古塔”在哪里?文化底蕴引游人“穿越古今”
润滑油水分离性/抗乳化性/破乳化度(Water Separability)
间歇性厌恶伴侣背后的心理学:不是你的错,也不是不爱了!
人到中年,最大的牢笼,是自己的认知,7点建议,提升你的认知
弓形虫病预防知识
东莞八景映古今 新老风光各千秋
寻找下一个“地球”!紫金山天文台等联合发布近邻宜居行星巡天计划
怎样调更护眼?怎样放不影响阅读?用对台灯的小贴士→
中国政法大学:部分学生存在“铁饭碗”就业取向的路径依赖
【母校风光】苏州河畔的华东政法大学长宁校区,百年建筑越品越美!
秦宣太后芈八子:中国历史上首位干政的后宫女性