用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>//声明propsconst 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')

总体效果:

新增效果:

删除效果:

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

查找效果:

全部效果:

未完成效果:

完成效果:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yudao-cloud微服务系统系统模块+后台管理系统成功运行

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 第一章 芋…

Covalent Network(CQT)近三个月代币回购超 10 万美元

Covalent Network&#xff08;CQT&#xff09;报告了其代币回购计划的显著增长&#xff0c;自 2024 年 1 月底启动以来&#xff0c;已从公开市场回购了价值超过10万美元的 CQT 代币。该机制通过 Covalent Network&#xff08;CQT&#xff09;的 API 收入来回购 CQT 代币&#x…

大数据计算引擎中的Calcite

1.Calcite介绍 Calcite是一个动态数据库管理框架&#xff0c;具备数据库管理系统的功能 Calcite具备SQL解析、校验、优化、生成、连接查询等功能 Calcite能够为不同平台和数据源提供统一的查询引擎 2.Calcite能力 比如&#xff0c;对于HBase而言&#xff0c;没有SQL查询的能力…

【java】hashCode 方法

HashSet HashSet 是一个集合&#xff0c;该集合的作用是去重。 import java.util.HashSet; public class Test {public static void main(String[] args) {HashSet hashSet new HashSet();People people1 new People();People people2 new People();hashSet.add("hel…

大模型提示工程(Prompt)(上篇),掌握Prompt原理与技巧,提高AI生成内容质量

我们了解到&#xff0c;现在的大模型&#xff0c;基本都是基于transformer的GPT模型&#xff0c;以ChatGPT为例&#xff0c;之前我们提到了&#xff0c;它是一种基于GPT模型的对话生成模型&#xff0c;它可以让计算机自动学习对话语料库中的模式&#xff0c;并生成连贯、自然的…

C++中布隆过滤器

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【css】select实现placeholder效果

场景&#xff1a;使用select下拉选择框的时候&#xff0c;需要像其他控件一样提示默认信息。 问题&#xff1a;表单控件select没有placeholder属性。 解决方案&#xff1a;通过css实现&#xff0c;不需要js <style>select > option[disabled]{ color:#999;cursor: n…

安卓和ios设置自己的短链

ios 的info.plist文件 设置 CFBundleURLSchemes 其中konnect 就是设置app的短链名称 <array><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>org.konnect.app</str…

网络安全之防范钓鱼邮件

随着互联网的快速发展&#xff0c;新的网络攻击形式“网络钓鱼”呈现逐年上升的趋势&#xff0c;利用网络钓鱼进行欺骗的行为越来越猖獗&#xff0c;对互联网的安全威胁越来越大。网络钓鱼最常见的欺骗方式就是向目标群体发送钓鱼邮件&#xff0c;而邮件标题和内容&#xff0c;…

为什么要存在零欧姆电阻?

一般为五十好欧 零欧姆电阻的作用&#xff1a; 零欧姆参考的阻值&#xff1a; 零欧姆电阻的过载能力&#xff1a; 完&#xff01;

User Agent 解析:它是什么以及工作原理

什么是User Agent? UserAgent&#xff0c;简称UA&#xff0c;是一个使服务器能够识别用户使用的浏览器类型、版本以及运行浏览器的操作系统等信息的字符串。它作为浏览器请求头部信息的一部分发送给服务器&#xff0c;以便服务器可以返回合适格式和版本的内容。 跟Cookie一样…

uniapp对uni.request()的封装以及使用

官方文档 uni.request(OBJECT) | uni-app官网 (dcloud.net.cn) uni.request参数 参数名说明url是写api地址的data是用来传值的对于 GET 方法&#xff0c;会将数据 转换为 query string。例如 { name: name, age: 18 } 转换后的结果是 namename&age18。对于 POST 方法且 …