vue2的待办事项案例

news2024/11/19 0:47:03

头部组件

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java Web】过滤器

目录 一、过滤器概述 二、过滤器使用 2.1 注解方式配置过滤器 三、过滤器生命周期 四、过滤器链及其执行顺序 一、过滤器概述 过滤器应用在服务器上类似于防火墙&#xff0c;用户的请求和响应报文在转化为HttpServletRequest和HttpServletResponse对象后&#xff0c;都会先经过…

LongRAG:利用长上下文大语言模型提升检索生成效果

一、前言 前面我们已经介绍了多种检索增强生成 (RAG) 技术&#xff0c;基本上在保证数据质量的前提下&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术能够有效提高检索效率和质量&#xff0c;相对于大模型微调技术&#xff0c;其最大的短板还是在于有限的上下文窗口…

【科学计算与可视化】3. Matplotlib 绘图基础

安装 pip install matplotlib 官方文档 https://matplotlib.org/stable/api/pyplot_summary.html 主要介绍一些图片绘制的简要使用&#xff0c;更加详细和进阶需要可参考 以上官方文档。 1 绘制基础 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴…

基于DeepNLP AI Store真人点评和ShowCase分享社区-AI for Image Generator

来源 quora 社区: https://deepnlpaistore.quora.com/ github: https://rockingdingo.github.io/deepnlp/store/image_generator 内容 DeepNLP AI Store 网址&#xff1a;http://www.deepnlp.org/store/image-generator 网站针对图像生成类别 Image Generator下多个AI工具如 …

汽车免拆诊断案例 | 2016 款吉利帝豪EV车无法加速

故障现象 一辆2016款吉利帝豪EV车&#xff0c;累计行驶里程约为28.4万km&#xff0c;车主反映车辆无法加速。 故障诊断 接车后路试&#xff0c;行驶约1 km&#xff0c;踩下加速踏板&#xff0c;无法加速&#xff0c;车速为20 km/h左右&#xff0c;同时组合仪表上的电机及控制…

告别数据线!轻松实现iOS和安卓设备间的文件共享

用 AirDroid 的附近传输功能&#xff0c;完全免费&#xff0c;几十个G的文件也可以相互传输。不限制iPhone和iPad数量&#xff0c;多个设备同时登录也不会强迫下线。 当你要在苹果手机和安卓手机之间传输文件&#xff0c;请将AirDroid安装到两台手机上&#xff0c;然后登录同一…

ce学习第一天(例行性工作,chrony服务时间同步,两台服务器免密登录)

1、Linux 的例行性工作 1.1单一执行的例行性工作 at 单一执行的例行性工作&#xff1a;单一执行的例行性工作&#xff1a;仅处理执行一次就结束了&#xff0c;at -> atd 1.1.1 at 命令的实际工作过程 1、我们使用 at 命令来生成所要运行的工作&#xff0c;并将这个工作&a…

【项目实训】falsk后端连接数据库以及与前端vue进行通信

falsk连接数据库 我们整个项目采用vueflaskmysql的框架&#xff0c;之前已经搭建好了mysql数据库&#xff0c;现在要做的是使用flask连接到数据库并测试 安装flask 首先安装flask pip install flask 进行数据库连接 数据库连接需要使用到pymysql库以及flask库 连接数据库…

Unity之Hololens2开发MRTK Profile详解

前言 配置 MRTK 的主要方式之一是使用基础包中的配置文件。 场景中的主要 MixedRealityToolkit 对象具有活动配置文件 - 一个 ScriptableObject。 顶级 MRTK 配置配置文件包含主核心系统的每个核心的子配置文件数据,每个主核心系统都旨在配置其相应子系统的行为。 此外,这些…

最新自助下单彩虹云商城系统源码,含小储云商城模板免授权

最新彩虹商城源码,含小储云商城模板免授权&#xff0c;试用了一下还行&#xff0c;具体的大家可以看看 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89405387 更多资源下载&#xff1a;关注我。

JavaWeb——MySQL数据库:约束

目录 1. 约束 1.1 概念&#xff1a; 1.2 分类&#xff1a; 1.3 使用&#xff1a; 1.4 外键约束; 1.5 总结 数据库&#xff1a;数据库都有约束&#xff0c;数据库设计&#xff0c;多表查询&#xff0c;事物这四方面的知识&#xff1b; 我们先按这个顺序进行学习&#xff…

如何以智能方式安装 Python

Python易于使用&#xff0c;对初学者友好&#xff0c;功能强大&#xff0c;几乎可以为任何应用程序创建强大的软件。 但与任何其他软件一样&#xff0c;Python 的设置和管理可能很复杂。 在本文中&#xff0c;我们将介绍如何正确设置 Python。 您将学习如何选择合适的版本、…

NISP国家信息安全水平考试

国家信息安全水平考试(NISP)是中国信息安全测评中心考试、发证&#xff0c;由国家网络空间安全人才培养基地运营管理&#xff0c;并授权网安世纪科技有限公司为NISP证书管理中心。 中国信息安全测评中心开展国家信息安全水平考试(NISP)考试项目&#xff0c;是为普及信息安全/网…

win11系统重装?正版系统Windows11安装重启!保姆级重装系统攻略!

随着科技的不断发展&#xff0c;Windows 11系统已经逐渐成为了众多电脑用户的新选择。然而&#xff0c;当当电脑出现严重故障、受到病毒攻击、软件冲突、系统升级失败、硬件更换或升级、系统性能下降或个性化需求等情况时&#xff0c;重装系统可能是一个有效的解决方案。本文将…

[YOLOv8单机多卡GPU问题解决]

问题&#xff1a; Transferred 319/355 items from pretrained weights DDP: debug command /home/user/miniconda3/bin/python -m tor ch.distributed.run --nproc_per_node 4 --master_port 54123/home/user/.config/Ultralytics/DDP/_temp_vpkq2tmy140546244784832.py Erro…

华为电脑重装系统如何操作?电脑Win11系统重装注意什么?图文详细解答

随着科技的不断进步&#xff0c;操作系统更新换代的步伐也日益加快。华为电脑作为市场中的佼佼者&#xff0c;其搭载的Windows 11系统凭借其强大的性能和丰富的功能受到了用户的广泛好评。然而&#xff0c;随着使用时间的推移&#xff0c;系统可能会出现各种问题&#xff0c;如…

UE引擎实现ShadowMap、体积光(C++)

前言 整体上参考了YivanLee大佬的这两篇文&#xff1a; 虚幻4渲染编程&#xff08;灯光篇&#xff09;【第一卷&#xff1a;各种ShadowMap】 虚幻4渲染编程&#xff08;灯光篇&#xff09;【第二卷&#xff1a;体积光】 正文 1、ShadowMap &#xff08;1&#xff09;创建工…

Golang | Leetcode Golang题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; /** 102. 二叉树的递归遍历*/ func levelOrder(root *TreeNode) [][]int {arr : [][]int{}depth : 0var order func(root *TreeNode, depth int)order func(root *TreeNode, depth int) {if root nil {return}if len(arr) depth {arr a…

Open3D 显示带有强度的点云数据

目录 一、概述 1.1强度信息的意义 1.2应用场景 二、代码实现 三、实现效果 一、概述 在点云数据中&#xff0c;强度&#xff08;Intensity&#xff09;指的是激光雷达传感器在扫描环境时&#xff0c;每个点返回的反射强度值。这些强度值代表了激光脉冲返回的能量&#xff…

基于振弦采集仪的工程安全监测技术研究与应用

基于振弦采集仪的工程安全监测技术研究与应用 随着工程规模的不断扩大和复杂性的增加&#xff0c;工程安全监测变得越来越重要。工程安全监测的目的是保证工程的安全运行&#xff0c;预防事故的发生&#xff0c;保护人们的生命财产安全。其中&#xff0c;振弦采集仪作为一种重…