首页 > 其他分享 >vue--day50--todolist案例自定义事件修改footer 和header 修改

vue--day50--todolist案例自定义事件修改footer 和header 修改

时间:2023-08-01 23:57:29浏览次数:30  
标签:vue return 自定义 -- 修改 1px done todo todos

1.MyHeader.vue

<template> <div class="todo-header"> <!--v-model:="title" 是实时绑定的 --> <input type="text" placeholder="请输入你的任务名称,回车键确认" v-model="title" @keyup.enter="add"/> </div> </template>
<script> import {nanoid} from 'nanoid' export default { name:"MyHeader", data(){ return { title:"" } }, methods:{ add(){ //console.log(e.target.value);   //const todoObj={id:nanoid(),title:e.target.value,done:false} if(!this.title.trim()) return alert("输入不能为空"); //将用户的输入包装成一个todo 对象 const todoObj={id:nanoid(),title:this.title,done:false} //console.log(todoObj); // 通知app 组件去添加一个todo 对象 this.$emit('addTodo',todoObj) this.title='' } } } </script>

<style scoped>
/*header*/ .todo-header input { width: 560px; height: 28px; font-size: 14px; border: 1px solid #ccc; border-radius: 4px; padding: 4px 7px; }
.todo-header input:focus { outline: none; border-color: rgba(82, 168, 236, 0.8); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); }
</style>

 

 

2.MyFooter.vue

<template> <div class="todo-footer" v-show="total"> <label> <!-- <input type="checkbox" :checked="isAll" @change="checkAll"/> --> <!--换种写法输入类型的节点 初始值要展示 并且后面要交互--> <input type="checkbox" v-model="isAll" /> </label> <span> <span>已完成{{ doneTotal }}</span>/ 全部{{ total}} </span> <button class="btn btn-danger" @click="clearAll">清除已完成任务</button> </div> </template>

<script> export default { name:"MyFooter", props:['todos'], computed:{ total(){ return this.todos.length }, doneTotal(){ // const donetotal=this.todos.reduce((pre,current)=>{ // //console.log('@@@@@@@'); // return pre+(current.done?1:0) // },0) // return donetotal; //简写 return this.todos.reduce((pre,current)=>pre+(current.done?1:0),0);
}, // 这个是简写的形式 只被读取 不能被修改 // isAll(){ // return this.doneTotal===this.total&&this.total>0 // }
isAll:{ get(){ return this.doneTotal===this.total&&this.total>0 }, set(checked){ this.$emit('checkAllTodo',checked)   } } }, methods:{ checkAll(e){ this.checkAllTodo(e.target.checked) }, clearAll(){   this.$emit('clearAllTodo') } } } </script>

<style scoped> /*footer*/ .todo-footer { height: 40px; line-height: 40px; padding-left: 6px; margin-top: 5px; }
.todo-footer label { display: inline-block; margin-right: 20px; cursor: pointer; }
.todo-footer label input { position: relative; top: -1px; vertical-align: middle; margin-right: 5px; }
.todo-footer button { float: right; margin-top: 5px; }
</style>

 

 

3.App.vue

 

 

<template> <div id="root"> <div class="todo-container"> <div class="todo-wrap"> <!-- @addTodo 事件名 addTodo 回调名--> <MyHeader @addTodo="addTodo"/> <!--父亲给儿子传数据 父亲通过数据绑定传数据 儿子通过 props:['todos'],//声明接收todo 对象 --> <MyList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"/> <MyFooter :todos="todos" @checkAllTodo="checkAllTodo" @clearAllTodo="clearAllTodo"/> </div> </div> </div>     </template>
<script> //样式的引入和这里有关系 import MyHeader from './components/MyHeader.vue'; import MyList from './components/MyList.vue'; import MyFooter from './components/MyFooter.vue';

export default { name: 'App', components: { MyHeader, MyList, MyFooter }, data(){ return { todos:JSON.parse(localStorage.getItem("todos"))||[] }   },
methods:{ // 添加一个todo addTodo(todoObj){ // console.log('我是app组件,我收到了数据x==',todoObj); this.todos.unshift(todoObj)
}, //勾选or 取消勾选 todo checkTodo(id){ this.todos.forEach((todo)=>{ if(todo.id===id) todo.done=!todo.done }) }, //删除一个todo deleteTodo(id){ this.todos=this.todos.filter((todo)=>{ return todo.id!==id; }) },
//全选or全不选 checkAllTodo(done){ this.todos.forEach((todo)=>{ todo.done=done }) },
clearAllTodo(){ this.todos=this.todos.filter((todo)=>{ return !todo.done }) }
}, watch:{ // todos(value){ // localStorage.setItem("todos", JSON.stringify(value)); // } todos:{ deep:true, handler(value){ localStorage.setItem("todos", JSON.stringify(value)); } }
} } </script>
<style>

/* 整体样式 */ body { background: rgba(230, 241, 245, 0.816); }
.btn { display: inline-block; padding: 4px 12px; margin-bottom: 0; font-size: 14px; line-height: 20px; text-align: center; vertical-align: middle; cursor: pointer; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); border-radius: 4px; }
.btn-danger { color: #fff; background-color: #da4f49; border: 1px solid #bd362f; }
.btn-danger:hover { color: #fff; background-color: #bd362f; }
.btn:focus { outline: none; }
.todo-container { width: 600px; margin: 0 auto; }
.todo-container .todo-wrap { padding: 10px; border: 1px solid #ddd; border-radius: 5px; }
 
 

  </style>

标签:vue,return,自定义,--,修改,1px,done,todo,todos
From: https://www.cnblogs.com/satisfysmy/p/17599459.html

相关文章

  • 【技术积累】Linux中的命令行【理论篇】【三】
    apt-get命令命令介绍DebianLinux发行版中的APT软件包管理工具,apt-get命令 是DebianLinux发行版中的APT软件包管理工具。所有基于Debian的发行都使用这个包管理系统。deb包可以把一个应用的文件包在一起,大体就如同Windows上的安装文件。命令说明管理指令:对APT软件包的管理操......
  • C#泛型知识点
    当使用C#编程时,泛型是一种非常强大和有用的功能。泛型允许您编写可重用的代码,以处理不同的数据类型,同时提供类型安全和更高的性能。本篇博客将介绍C#泛型的基本概念、用法和示例代码,以帮助您更好地理解和使用泛型。C#泛型-强大的类型安全在传统的C#编程中,我们通常会使用Object......
  • Linux存储管理
    1、磁盘分区TODO2、Swap分区2.1、Swap分区简介作用:  swap分区通常被称为交换分区,是一块特殊的硬盘空间。当实际内存不够用时,OS会将内存中暂时不用的部分数据,放在交换分区中,为当前运行的程序提供足够的内存空间。优先:  通过操作系统的调度,应用程序实际可使用远超过......
  • 算法-01-查找
    线性搜索法(LinearSearch)线性搜索(LinearSearch)算法又称为循序搜索(SequentialSearch)算法,是学习编程语言最先需要学会的搜索算法。它可以按照元素在集合中的顺序,从头开始进行走访,并连续判断目前走访到的元素是否是我们想要找的元素。 线性搜索法(LinearSearch)线性搜......
  • ugui学习 - PC键盘输入
    最终效果 实现的功能a)点击后显示了光标,才能输入b)按esc,退出输入,光标会隐藏c)输入时,内容加在光标后面d)Backspace删除光标后的字符e)Delete删除光标前的字符usingUnityEngine;usingUnityEngine.EventSystems;usingUnityEngine.UI;publicclassMyI......
  • 有哪些靠谱的证书可以考?
     有哪些靠谱的证书可以考人力资源社会保障部办公厅关于2023年度专业技术人员职业资格考试计划及有关事项的通知:http://www.gov.cn/zhengce/zhengceku/2023-01/20/content_5738275.htm中国教育考试网:https://www.neea.edu.cn/中国人事考试网:http://www.cpta.com.cn/index.ht......
  • Docker的办公网络与容器网络互通简单实现思路
    参考博文https://www.cnblogs.com/quemengqio/p/17034668.html需求:本地电脑需要连接dev环境的docker容器网络,需要dev-java-services这台主机专门做路由转发现在需要在办公室的出口路由器上,设置静态路由,将dev的docker网络的网段,路由到dev-java-services节点上iproute172.1......
  • 基于ResNet-101深度学习网络的图像目标识别算法matlab仿真
    1.算法理论概述       介绍ResNet-101的基本原理和数学模型,并解释其在图像识别中的优势。然后,我们将详细介绍如何使用深度学习框架实现ResNet-101,并在图像数据集上进行训练和测试。最后,我们将总结本文的主要内容并提出进一步的研究方向。 1.1、ResNet-101的基本原理......
  • Docker教程
     正文:Docker介绍Docker安装镜像文件容器文件编写Dockerfile导入导出和发布 Docker官网:https://www.docker.comGithubDocker源码:https://github.com/docker/docker-ce Docker介绍一、环境配置的难题Docker的出现是为了解决环境配置的难题,软件开发最大的麻烦......
  • css 中强制换行后,伪类元素变形,用到的flex-shrink 属性
    之前都没用过这个属性,最近做项目遇到一个不同屏幕下可能会换行的问题,设置了强制不换行,但是伪类元素就没挤没了,请教了同事,用到了flex-shrink属性然后我就去看了看这个属性的用法,简单记录一下flex-shrink属性指定了flex元素的收缩规则。flex元素仅在默认宽度之和大于容器的时......