用Vue做一个待办事项

这篇具有很好参考价值的文章主要介绍了用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')

总体效果:

用Vue做一个待办事项,vue.js,javascript,前端

新增效果:

用Vue做一个待办事项,vue.js,javascript,前端

删除效果:

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

用Vue做一个待办事项,vue.js,javascript,前端

查找效果:

全部效果:

用Vue做一个待办事项,vue.js,javascript,前端

未完成效果:

用Vue做一个待办事项,vue.js,javascript,前端

完成效果:

用Vue做一个待办事项,vue.js,javascript,前端文章来源地址https://www.toymoban.com/news/detail-858104.html

到了这里,关于用Vue做一个待办事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【js&vue】联合gtp仿写一个简单的vue框架,以此深度学习JavaScript

    lifecycle.js 注解: this.$options.beforeMount.call(this);与 this.$options.beforeMount();有什么区别: call(this)  的作用是将当前对象( this )作为参数传递给  beforeMount  方法,使得在  beforeMount  方法内部可以通过  this  访问到当前对象的上下文 直接调用了  beforeMount  方法,没有指定上下

    2024年02月09日
    浏览(39)
  • 【js小案例】视频倍数播放、计算机、待办事项管理

    视频倍数播放示例图:  视频倍数播放代码: 计算机效果图:  计算机代码: 待办事项管理效果图:  待办事项管理代码:

    2024年02月12日
    浏览(28)
  • 如何建立一个好的待办事项系统并提高工作效率

    如果你有一系列的任务需要完成,你会如何记住它们呢? 最简单的方法当然是将它们记在脑中,但如果任务的数量很多,记忆的细节难免模糊。纸和笔也是一个不错的选择,但纸质的任务清单容易遗失或者损坏。让应用来帮忙当然也是个不错的选择。不过,现在市面上的任务

    2024年02月08日
    浏览(32)
  • vue-codemirror实现一个前端代码在线编辑器,可处理 HTML,VUE,JS,CSS代码在线编辑

    先找个目录创建一个vue项目 例如 我们想要项目叫 editor 在终端执行 2和3其实都可以 但个人建议 最近还是2会更稳定一些 在终端执行 引入依赖包 然后在项目src目录下创建 utils 文件夹 里面创建一个setting.js 参考代码如下 然后 这边 调用组件的代码 因为项目也刚创 我直接写 s

    2024年02月15日
    浏览(37)
  • 前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

    当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。 vue、js、webpack 编译项目时动态生成一个记录版本号的文件 轮询(20s、自己设定时间)这个文件,判断版

    2024年02月02日
    浏览(45)
  • JavaScript - 判断当前时间是否在指定区间内,例如:9:00~12:00(检查当前时间是否处于规定的两个时间段范围内),适用于 vue.js / uniapp / 微信小程序等前端项目

    例如,您想知道当前时间是否处于 9:00 ~ 12:00 时间区间内,然后根据这个判断进而实现业务逻辑。 如下示例所示, 本文提供一个函数,您只需要传入 2 个时间区间,便可得出当前时间是否在该时间区间范围内: 您可以一键复制,直接粘贴到您的项目中。 您只需要传入开始时

    2024年02月16日
    浏览(46)
  • vue3中Fragment特性的一个bug,需要留意的注意事项

    vue3中的Fragment 模版碎片特性是什么,简单的理解就是 template模板代码 不在像vue2中那样必须在根节点在包裹一层节点了。 vue2写法 vue3写法 vue3中Fragment特性的一个bug(需要留意的问题) 组件HelloWorld: 组件HelloWorld的使用 同时控制台waring : 利用开发者模式看dom结构, 发现v-show的

    2024年01月22日
    浏览(30)
  • 手机待办事项app哪个好?

    手机是日常很多人随身携带的设备,手机除了拥有通讯功能外,还能帮助大家高效管理日常工作,借助手机上的待办事项提醒APP可以快速地帮助大家规划日常事务,提高工作的效率。 过去,我也曾经在寻找一款能够将工作任务清晰罗列的APP时,在通过对多款软件进行对比后,

    2024年02月07日
    浏览(29)
  • 前端随笔:HTML/CSS/JavaScript和Vue

    最近因为工作需要,需要接触一些前端的东西。之前虽然大体上了解过 HTML 、 CSS 和 JavaScript ,也知道 HTML 定义了内容、 CSS 定义了样式、 JavaScript 定义了行为,但是却没有详细的学习过前端三件套的细节。而最近的工作中需要使用 Vue ,并且想到未来的工作中使用 Vue 能够更

    2024年02月16日
    浏览(30)
  • JavaScript 框架比较:Angular、React、Vue.js

    在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。这些首字母相同的选项各自代表不同的技术加工具组合。为了在这些技术栈中做出明智选择,让我们先从核心组件聊起,再对各自前端框架(React、Angular 和 Vue)进行简化比

    2024年01月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包