用Vue做一个待办事项

        这个待办事项有以下功能:增删查,既新增待办事项,删除待办事项,查看全部,未完成,完成待办事项,当鼠标移动到待办事项上时会显示删除按钮

        分为四个部分来实现:ToDoHeader.vue、ToDoMain.vue、ToDoFooter.vue、ToDoList.vue

ToDoHeader.vue

头部部分

 <template>
 	<div>
 		<div class="header">
 			<p class="title">待办事项</p>
 			<input class="new-todo" type="text" placeholder="请填写任务" v-model.trim="name" @keyup.enter="enterName" />
 		</div>
 	</div>
 </template>
 <script setup>
 	import {
 		ref
 	} from 'vue'
 	const name = ref('')
 	const emit = defineEmits(['addTodo'])
 	const enterName = () => {
		// 触发自定义事件,为空时弹出警示框
		if(name.value===""){
			alert("任务名称不能为空")
			return
		}
 		emit('addTodo', name.value)
 		name.value = ''
 	}
	
 </script>

 <style>
	 .title{
		 font-size: 20px;
		 color: red;
		 height: 40px;
		 width: 86.5%;
		margin: 10px 40px 0 40px;
		 padding-top: 10px;
		 text-align: center;
		 border: 1px solid #ccc;
	 }
	 .new-todo{
		 height: 40px;
		 width: 80%;
		 margin: 5px 40px 0 40px;
		 padding: 4px 0 0 65px;
		 border: 1px solid #ccc;
	 }
 </style>

ToDoMain.vue

列表总体样式和删除样式

<template>
	<div class="main">
		<ul class="todo-list">
			<li v-for="item in list" :key="item.id" :class="{ completed: item.done }">
				<div class="view">
					<input class="toggle" type="checkbox" v-model="item.done" />
					<label>{{ item.name }}</label>
					<button class="destroy" @click="delTodo(item.id)"><div class="overlay">x</div></button>
				</div>
			</li>
		</ul>
	</div>
</template>

<script setup>
	//声明props
	const props = defineProps(['list'])
	//声明自定义事件
	const emit = defineEmits(['delTodo'])
	const delTodo = id => {
		id && emit('delToDo', id) // 触发事件
	}
</script>

<style>
	.view{
		position: relative;
		height: 40px;
		width: 800px;
		margin-left: 20px;
		padding-top: 15px;
		border-bottom: 1px solid #ccc;
	}
	li{
		margin-left: 20px;
	}
	label{
		position: absolute;
		left: 70px;
		top: 23px;
	}
	
	.destroy{
		float: right;
		border: none;
		background-color: white;
	}
	 .overlay{
		 position: absolute;
		 top: 26px;
			 font-size: 40px;
		     color: black;
		     /* 字体居中 */
		     transform: translate(-50%,-50%);
		     font-size: large;
		     /* 悬停前完全透明 */
		     opacity: 0;
		     transition: 0.3s ease-in-out; 
		 }
		  
		 .view:hover .overlay{
		     transition: 0.3s ease-in-out;
		     /* 悬停时完全不透明 */
		     opacity: 1;
		 }
		 
		 input[type="checkbox"] {
		 		appearance: none;
		 		/*取消默认的复选框样式*/
		 		width: 30px;
		 		/*设置方形宽度为20px*/
		 		height: 30px;
		 		/*设置方形高度为20px*/
		 		border: 1px solid #000;
		 		/*设置边框样式*/
		 		border-radius: 50%;
		 		/*将方形的边框改为圆形*/
		 	}
		 
		 	input[type="checkbox"]:checked {
		 		&:before {
		 			content: '\2713';
		 			/*添加一个对勾,默认颜色是黑色*/
		 			color: greenyellow;
		 			/*将对勾颜色改为白色*/
		 			font-size: 20px;
		 			margin-left: 5px;
		 			/*将对勾左边距改为4px,让它看着像居中*/
		 		}
		 	}
</style>

ToDoList.vue

列表部分

 <template>
 	<ToDoHeader @addTodo="addTodo"></ToDoHeader>
 	<ToDoMain :list="showList" @delToDo="delToDo"></ToDoMain>
 	<ToDoFooter :lastLength="lastLength" @updateStatus="updateStatus"></ToDoFooter>
 </template>
 <script setup>
 	import ToDoHeader from './ToDoHeader.vue'
 	import ToDoMain from './ToDoMain.vue'
 	import ToDoFooter from './ToDoFooter.vue'
 	import {
 		computed,
 		ref
 	} from 'vue'
 	const list = ref([{
 			id: 1,
 			name: '跑步',
 			done: false,
 		},
 		{
 			id: 2,
 			name: '健身',
 			done: true,
 		},
 	])
 	const addTodo = name => {
 		list.value.push({
 			name,
 			done: false,
 			id: ~~(Math.random() * 1000)
 		})
 	}
 	const delToDo = id => {
 		list.value = list.value.filter(item => item.id !== id)
 	}
 	const lastLength = computed(() => {
 		return list.value.filter(item => !item.done).length
 	})
 	const status = ref('all')
 	const showList = computed(() => {
 		if (status.value === 'all') {
 			return list.value
 		}else if (status.value === 'active') {
 			return list.value.filter(item => !item.done)
 		}else if (status.value === 'completed') {
 			return list.value.filter(item => item.done)
 		}
 	})
 	
 	const updateStatus = setStatus => {
 		status.value = setStatus // 将子组件的状态赋值给父组件
 	}
 </script>
 <style>
 </style>

ToDoFooter.vue

页脚部分

<template>
	<div class="footer">
		<span class="todo-count">共<strong>{{ lastLength }}</strong>条未完成任务</span>
		<ul class="filters">
			<li class="oneli">
				<a @click.prevent="emit('updateStatus', 'all')" :class="{ selected: status === 'all' }"
					href="#/">全部</a>
			</li>
			<li>
				<a @click.prevent="emit('updateStatus', 'active')" :class="{ selected: status === 'active' }"
					href="#/active">未完成</a>
			</li>
			<li>
				<a @click.prevent="emit('updateStatus', 'completed')" :class="{ selected: status === 'completed' }"
					href="#/completed">已完成</a>
			</li>
		</ul>
	</div>
</template>

<script setup>
	const emit = defineEmits(['updateStatus'])
	const props = defineProps(['lastLength', 'status'])
</script>

<style>
	.oneli{
		
		margin-left: 50%;
	}
	.todo-count {
		margin-left: 40px;
		float: left;
	}

	ul {
		margin-left: -25px;
		list-style-type: none;
	}

	li {
		float: left;
		margin-left: 4px;
	}

	a {
		border: 1px solid #d3d3d3;
		/* 清除a标签默认效果 */
		text-decoration: none;
		color: black;
		font-size: 8px;
	}
</style>

最后更改main.js中的代码

main.js

import { createApp } from 'vue'
import App from './components/ToDoList.vue'

createApp(App).mount('#app')

总体效果:

新增效果:

删除效果:

鼠标悬停时会显示删除按钮

查找效果:

全部效果:

未完成效果:

完成效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/569958.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

XYCTF 部分wp及学习记录

1.ezmd5 根据题目提示 我们知道应该是要上传两张md5值相同的图片 根据原文链接&#xff1a;cryptanalysis - Are there two known strings which have the same MD5 hash value? - Cryptography Stack Exchange 把保存下来的图片上传一下 得到flag 2.ezhttp 根据原文链接&…

多臂老虎机介绍【Multi-armed Bandits】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

Python基础05-数学运算与排列组合生成

在Python中进行数学运算和生成排列组合是数据科学、机器学习和日常编程中常见的任务。本文将介绍如何在Python中执行基本的数学运算、处理复数、使用数学函数、生成排列和组合、随机数生成、处理分数、统计函数以及处理无穷大和NaN值。 1. 基本算术运算 Python支持传统的四则…

26版SPSS操作教程(高级教程第十三章)

前言 #今日世界读书日&#xff0c;宝子你&#xff0c;读书了嘛~ #本期内容&#xff1a;主成分分析、因子分析、多维偏好分析 #由于导师最近布置了学习SPSS这款软件的任务&#xff0c;因此想来平台和大家一起交流下学习经验&#xff0c;这期推送内容接上一次高级教程第十二章…

【剪映专业版】05文字重叠

【剪映专业版】05文字重叠 1.在素材库中搜索纯黑背景&#xff0c;添加文本&#xff0c;设置合适的字体、字号等&#xff0c;导出备用。 2.返回窗口&#xff0c;设置字体颜色为纯黑&#xff0c;勾选描边设置描边为纯白&#xff0c;描边粗细值为8。导出备用。 3.将视频素材导入。…

SpringCloud系列(11)--将微服务注册进Eureka集群

前言&#xff1a;在上一章节中我们介绍并成功搭建了Eureka集群&#xff0c;本章节则介绍如何把微服务注册进Eureka集群&#xff0c;使服务达到高可用的目的 Eureka架构原理图 1、分别修改consumer-order80模块和provider-payment8001模块的application.yml文件&#xff0c;使这…

Win10 打开有些软件主界面会白屏不显示,其他软件都正常

环境&#xff1a; Win10专业版 英伟达4070 显卡 问题描述&#xff1a; Win10 打开有些软件主界面会白屏不显示,打开远程协助软件AIRMdesk,白色&#xff0c;其他软件都正常 解决方案&#xff1a; 网上说电脑没有接显示器独立显卡的关系导致 我是只有一台主机&#xff0c;没…

VUE3 ref,props,生命周期

1.--ref属性 1.1代码 1.1.1子表 <template><div class"person"><h1>中国</h1><h2 ref"title2">北京</h2><h3>尚硅谷</h3><button click"showLog">点我输出h2这个元素</button>&l…

海康智能相机FTP本地存图流程

背景&#xff1a;近期一个新项目需要使用到智能相机&#xff0c;借助智能相机算法直接输出检测结果并将相机图像进行本地化保存和展示。由于申购目标智能相机未到&#xff0c;暂时使用测试智能相机。 目标智能相机型号&#xff1a;海康智能相机MV-SC3050XC 当前测试相机型号…

MySQL主要内容

1&#xff0c;在表中插入数据 插入值的类型&#xff0c;必须和字段的类型保持一致 - 如果数据类型是字符串&#xff0c;必须引号引起来&#xff0c;数字的话&#xff0c;可以不加 - 插入的数据顺序和字段的顺序必须保持一致 格式一&#xff1a;向表中插入数据 insert in…

python爬虫学习第二十八天-------了解scrapy(二十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

【k8s】Kubernetes 1.29.4离线安装部署(总)

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

网工学习云计算HCIE感受如何?

作为一名网工&#xff0c;我经常会在各种网络论坛里查询搜索一些网络技术资料&#xff0c;以及跟论坛里的网友交流讨论平时在工作、学习中遇到的问题、故障&#xff0c;因此也经常能在论坛的首页看到誉天的宣传信息。机缘巧合之下关注了誉天的B站号&#xff0c;自从关注了誉天的…

真实世界的密码学(一)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 序言 当你拿起这本书时&#xff0c;你可能会想&#xff0c;为什么又一本关于密码学的书&#xff1f;甚至&#xff0c;为什么我要读这本…

【DDD领域驱动设计】战术设计--核心概念介绍

目录 前言 战术设计 基本概念 领域内&#xff1a; 实体 值对象 领域服务 模块 对象生命周期&#xff1a; 聚合 工厂 仓库 其他&#xff1a; 领域事件 事件溯源 实例介绍 前言 上一篇文章 DDD-事件风暴 属于领域驱动设计中的战略设计&#xff0c;战略设计主要从…

数据中台工具的选型要点_光点科技

数据中台工具扮演着举足轻重的角色。想要全面理解数据中台工具的意义、作用以及应用方式&#xff0c;就必须深入探讨这一概念以及相关实践。 数据中台工具概述 数据中台&#xff0c;是一个支持数据集成、管理、分析和服务的平台&#xff0c;它能够帮助企业统一数据资源&#xf…

GreatSQL统计信息相关知识点

相关知识点&#xff1a; INNODB_STATS_PERSISTON或用STATS_PERSIST1定义单个表时&#xff0c;优化器统计信息将持久化到磁盘。默认情况下&#xff0c;innodb_stats_persistent是启用的。 持久统计信息存储在mysql.innodb_table_stats和mysql.innodb_index_stats表中。 默认情…

梦境绘师:揭秘生成对抗网络(GAN)的魔法

梦境绘师&#xff1a;揭秘生成对抗网络&#xff08;GAN&#xff09;的魔法 1 引言 在今日的深度学习领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;已成为一项无人能外的技术&#xff0c;以其独特的数据生成能力俘获了无数研究者和工程师的心。这项技术不仅在理论上…

CSS3新增特性(二)

四、2D 转换 • 属性名&#xff1a;transform &#xff08;可用于制作2D转换&#xff0c;也可用于制作3D转转换&#xff1b;2D转换是平面上的转换&#xff0c;3D转换是在三维立体空间的转换&#xff09; • 作用&#xff1a;对元素进行水平或垂直方向的移动、缩放、旋转、拉长…

【GitHub】2FA认证(双重身份验证)

GitHub 2FA认证&#xff08;双重身份验证&#xff09; 写在最前面一、使用 TOTP 应用程序配置双2FA&#xff08;双因素身份验证&#xff09;1. 介绍2. github3. 认证 官网介绍小结 & 补充 &#xff1a;权限不足or验证码错误问题 &#x1f308;你好呀&#xff01;我是 是Yu欸…