vue2的待办事项案例

头部组件

<template>
    <div class="todo-header">
     <input type="text" placeholder="请输入你的任务名称,按回车键确认" @keyup.enter="add"/>
    </div>
</template>

<script>

import {nanoid} from 'nanoid'

export default {
      name:"MyHeader",
      props:['re'],
      methods: {
        add(e){
          if(!e.target.value.trim()) return alert("输入不能为空")
          const arr ={id:nanoid(),name:e.target.value,done:false}
          console.log(arr)
          this.re(arr) 
          e.target.value=''
        }
      },
      
};
</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>

列表组件

<template>
  <ul class="todo-main">
    <MyItem 
    v-for="arr in arrs" 
    :key="arr.id" 
    :arr="arr" 
    :changeDone="changeDone"     
    :del="del"
  /> 

  </ul>
</template>

<script>
import MyItem from "./MyItem.vue";

export default {
  name: "MyList",
  components: { MyItem },
  props:['arrs','changeDone','del'],
};
</script>

<style scoped>
/*main*/
.todo-main {
  margin-left: 0px;
  border: 5px solid #ddd;
  border-radius: 2px;
  padding: 0px;
}

.todo-empty {
  height: 40px;
  line-height: 40px;
  border: 1px solid #ddd;
  border-radius: 2px;
  padding-left: 5px;
  margin-top: 10px;
}
</style>

事件组件

<template>
  <li>
    <label>
      <input type="checkbox" :checked="arr.done" @change="a(arr.id)"/>
      <!-- <input type="checkbox" v-model="arr.done"/> -->
      <span>{{arr.name}}</span>
    </label>
    <button class="btn btn-danger" @click="d(arr.id)">删除</button>
  </li>
</template>

<script>
export default {
  name: "MyItem",
  props:['arr','changeDone','del'],
  methods: {
    a(id){
      this.changeDone(id)
    },
    d(id){
       if(confirm("确认删除吗")){
        console.log(id)
        this.del(id)
       }
    }
  },
};
</script>

<style scoped>
    /*item*/
    li {
      list-style: none;
      height: 36px;
      line-height: 36px;
      padding: 0 5px;
      border-bottom: 6px solid rgb(250, 238, 238);
    }

    li label {
      float: left;
      cursor: pointer;
    }

    li label li input {
      vertical-align: middle;
      margin-right: 6px;
      position: relative;
      top: -1px;
    }

    li button {
      float: right;
      display: none;
      margin-top: 3px;
    }

    li:before {
      content: initial;
    }

    li:last-child {
      border-bottom: none;
    }
    li:hover{
      background-color: aqua;
    }
    li:hover button{
      display: block;
    }
</style>

底部组件

<template>
  <div class="todo-footer" v-show="toTal" >
    <label>
      <!-- <input type="checkbox" @click="upd" :checked="toTals===toTal"> -->
         <input type="checkbox" v-model="isAll">
    </label>
    <span> <span >已完成{{toTals}}</span> / 全部{{toTal}} </span>
    <button class="btn btn-danger" @click="clearDone">清除已完成任务</button>
  </div>
</template>

<script>
export default {
  name: "MyFooter",
  props:['arrs','updDone','clearDone'],
  computed:{
     toTals(){
          // return this.arrs.reduce((pre,arr)=>{
          //   return  pre+ (arr.done?1:0)
          //  },0)
    return this.arrs.reduce((pre,arr)=>pre+ (arr.done?1:0),0) 
     },
     toTal(){
     return this.arrs.length
     },
     isAll:{
       get(){
          return this.toTal===this.toTals &&this.toTal>0
       },
       set(e){
          this.updDone(e) 
       } 
     }
  },
  // methods:{ 
  //       upd(e){
  //         // console.log(e)
  //        this.updDone(e.target.checked)    
  //       }
  // }
};
</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>

App组件

<template>
 <div id="root">
    <div class="todo-container">
      <div class="todo-wrap">
        <MyHeader :re="re"/>
        <MyList :arrs="todoArrs" :changeDone="changeDone" :del="del"/>
        <MyFooter :arrs="todoArrs" :updDone="updDone"  :clearDone="clearDone"/>
      </div>
    </div>
</div>
</template>

<script> 
import MyHeader from './components/MyHeader'
import MyFooter from './components/MyFooter'
import MyList from './components/MyList' 



export default {
  name: 'App',
  components: { MyHeader,MyFooter,MyList  },
  data() {
      return { 
      todoArrs:[
                  {id:"01",name:"吃饭",done:true},
                  {id:"02",name:"睡觉",done:false},
                  {id:"03",name:"打豆豆",done:true},
                  {id:"04",name:"玩游戏",done:false},
      ]
      }
},
   methods: {
    // 添加头部传过来的数据
    re(x){
       this.todoArrs.unshift(x)
       console.log("收到数据"+x)
    },
    //改变是否完成
    changeDone(id){
        this.todoArrs.forEach(a=>{
          if(id===a.id){
            a.done = !a.done 
            console.log(a)
          }
          
        }) 
    },
    //删除
    del(id){
      this.todoArrs =  this.todoArrs.filter(fli=>  fli.id!==id)
    },
    //全选或全不选
    updDone(v){
      this.todoArrs.forEach((e)=>{
            e.done =v
      })
    },
    //删除已完成的任务
    clearDone(){
       this.todoArrs =  this.todoArrs.filter(fli=>fli.done!==true)
    }
   },
}
</script>

<style>
    body {
      background: #fff;
    }

    .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>

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

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

相关文章

智能语音抽油烟机:置入WTK6900L离线语音识别芯片 掌控厨房新风尚

一、抽油烟机语音识别芯片开发背景 在繁忙的现代生活中&#xff0c;人们对于家居生活的便捷性和舒适性要求越来越高。传统的抽油烟机操作方式往往需要用户手动调节风速、开关等功能&#xff0c;不仅操作繁琐&#xff0c;而且在烹饪过程中容易分散注意力&#xff0c;增加安全隐…

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC

Java登录管理功能的自我理解(尚庭公寓)

登录管理 背景知识 1. 认证方案概述 有两种常见的认证方案&#xff0c;分别是基于Session的认证和基于Token的认证&#xff0c;下面逐一进行介绍 基于Session 基于Session的认证流程如下图所示 该方案的特点 登录用户信息保存在服务端内存&#xff08;Session对象&#xff…

安全技术和防火墙(iptables)

安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要是提供报警和事后监督&#xff0c;不主动介入&#xff0c;类似于监控。 入侵防御系统&#xff1a;透明模式工作&#xff0c;对数据包&#xff0c;网络监控&#xff0c;服务攻击&#xff0c;木马&#…

【数据结构】(C语言):栈

栈&#xff1a; 线性的集合。后进先出&#xff08;LIFO&#xff0c;last in first out&#xff09;。两个指针&#xff1a;指向栈顶和栈底。栈顶指向最后进入且第一个出去的元素。栈底指向第一个进入且最后一个出去的元素。两个操作&#xff1a;入栈&#xff08;往栈尾添加元素…

力扣最新详解5道题:两数之和三数之和四数之和

目录 一、查找总价格为目标值的两个商品 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;对撞指针 二、两数之和 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;哈希表法 三、三数之和 题目 题解 方法一&#xff1a;排序暴力枚举set去重 …

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …

智能革新:AI写作工具如何重塑论文生成的艺术

在学术探索的征途中&#xff0c;AI论文工具本应是助力前行的风帆&#xff0c;而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时&#xff0c;遭遇不靠谱AI工具的沮丧与无奈。毕竟&#xff0c;时间可以被浪费&#xff0c;但金钱和信任却不可轻弃。 作为一名资深的AI…

解锁数据资产的无限潜能:深入探索创新的数据分析技术,挖掘其在实际应用场景中的广阔价值,助力企业发掘数据背后的深层信息,实现业务的持续增长与创新

目录 一、引言 二、创新数据分析技术的发展 1、大数据分析技术 2、人工智能与机器学习 3、可视化分析技术 三、创新数据分析技术在实际应用场景中的价值 1、市场洞察与竞争分析 2、客户细分与个性化营销 3、业务流程优化与风险管理 4、产品创新与研发 四、案例分析 …

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题&#xff0c;确保在高并发场景下对共享资源的访问是互斥的&#xff0c;避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

简单的springboot整合activiti5.22.0

简单的springboot整合activiti5.22.0 1. 需求 我们公司原本的流程服务是本地workflow模块以及一个远程的webService对应的activiti服务&#xff0c;其中activiti版本为5.22.0&#xff0c;之前想将activiiti5.22.0进行升级&#xff0c;选择了camunda&#xff0c;也对项目进行了…

《梦醒蝶飞:释放Excel函数与公式的力量》6.1 DATE函数

6.1 DATE函数 第一节&#xff1a;DATE函数 1&#xff09;DATE函数概述 DATE函数是Excel中的一个内置函数&#xff0c;用于根据指定的年、月、日返回对应的日期序列号。这个函数非常有用&#xff0c;尤其是在处理日期数据时&#xff0c;它可以帮助你构建特定的日期&#xff0…

20-OWASP top10--XXS跨站脚本攻击

目录 什么是xxs&#xff1f; XSS漏洞出现的原因 XSS分类 反射型XSS 储存型XSS DOM型 XSS XSS漏洞复现 XSS的危害或能做什么&#xff1f; 劫持用户cookie 钓鱼登录 XSS获取键盘记录 同源策略 &#xff08;1&#xff09;什么是跨域 &#xff08;2&#xff09;同源策略…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及氢储能与需求响应的路域综合能源系统规划方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

在数据库领域是如何实现“多租户”的呢?

数据库多租技术介绍 随着云计算时代的到来&#xff0c;多租户的概念也逐渐广为人知。“多租户”使得租户之间可以共享物理资源&#xff0c;能够帮助用户节约硬件成本和运维成本&#xff0c;提高资源利用效率。同时&#xff0c;在实现的过程中&#xff0c;考虑到共享带来的安全…

【单片机毕业设计选题24031】-基于STM32的智能手环设计

系统功能: 使用12864OLED液晶屏显示当前的步数&#xff0c;温度值&#xff0c;心率和报警值&#xff0c;单位是心率/分钟设置步长&#xff0c;测量里程&#xff1b;可以设置温度心率的上下限报警值&#xff0c;设置、加、减&#xff1b;用红外传感器XL01实现心率的测量&#x…

华为云x86架构下部署mysql

华为云x86架构下部署mysql 1. 配置X86架构ESC2. 查看本系统中有没有安装mariadb相关的组件&#xff0c;有则卸载3. 安装mysql4. 启动mysql5. 登录MySQL&#xff0c;修改密码&#xff0c;开放访问权限 1. 配置X86架构ESC 2. 查看本系统中有没有安装mariadb相关的组件&#xff0c…

拥抱数字化未来,如何以费控驱动业务发展?

管理费用是企业运营中仅次于人力成本的第二大可控成本&#xff0c;一般会占到企业年度收入的5%—10%&#xff0c;但多数企业存在费用疏于管理、费用管理制度流于纸面难落地、费用浪费严重等问题。 如果不进行科学管理&#xff0c;有专家表示&#xff0c;估计企业每年至少有10%的…

Java家教系统小程序APP公众号h5源码

让学习更高效&#xff0c;更便捷 &#x1f31f; 引言&#xff1a;家教新选择&#xff0c;小程序来助力 在快节奏的现代生活中&#xff0c;家长们越来越注重孩子的教育问题。然而&#xff0c;如何为孩子找到一位合适的家教老师&#xff0c;成为了许多家长头疼的问题。现在&…