Vue设计记事本

news2024/9/29 19:22:17

项目描述

项目实现功能有:记录今天要完成的任务,勾选已经完成的任务,删除已经完成的全部任务。
界面展示:
在这里插入图片描述

代码展示

创建一个Myitem.vue文件夹

<template>

<li>
    <label >
      <input type="checkbox" :checked="todo.done" @click="handle(todo.id)"/> 
      <span>{{todo.title}}</span>
    </label>
    <button class="btn btn-danger" @click="delect(todo.id)" >删除</button>
</li>
</template>

<script>
export default {
    name:'MyItem',
    props:['todo','checkTodo','delectTodo'],
   methods:{
    handle(id){
        //通知app去将tudo.down取反
       this.checkTodo(id)
    },
    delect(id){
        //通知app删除当前todoObj
        this.delectTodo(id)
    }
   }

}
</script>

<style scoped>
li{
    list-style:none;
    height:36px;
    line-height: 36px;
    padding:0 50px;
    border-bottom:1px solid #ddd;

}
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:#ddd;
}
li:hover button{
    display:block;
}



</style>

2.在components文件夹下创建 Myheader文件夹

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

        
  
</template>

<script>
//引入
import {nanoid} from 'nanoid'

export default {
    name:'MyHeader',
    data(){
       return {
        value:''}
    }, 
    props:['addtodos'],
    methods:{
        add(e){
            //校验数据
            if(!this.value.trim()){
                return alert('输入不能为空!')
            }
            const todoObj={id:nanoid(),title:this.value,done:false}
            this.addtodos(todoObj)
            this.value=''
        }
    },
   


}
</script>

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

3.在同一个文件夹下创建MyFooter.vue文件夹

<template>
    <div class = 'todo-footer' v-if="todosAll">
        <label for="">
            <input type="checkbox" :checked="isAll" @click="allTodo"/> 
        </label>
        <span>已完成{{countDone}}/全部{{todosAll}}</span>
        <button class="btn btn-danger"  @click="delectDoneall">清除已经完成的内容</button>
    </div>
  
</template>

<script>

export default {
 name:'MyFooter',
 props:['todos','delectDone'],
 date(){
 },
methods:{
    allTodo(e){
 
        if(e.target.checked==true){
            this.todos.forEach((todo)=>{
                todo.done=true
            })
        }
        else{
            this.todos.forEach((todo)=>{
                todo.done=false
            })
        }
    },
    delectDoneall(){
        this.delectDone()
    }

   
},
 
 computed:{
    todosAll(){
        return this.todos.length
    },
    countDone(){
        let  i  =0
     this.todos.forEach(todo => {
        if(todo.done==true){
            i++
        }}
      )
      return i 
     
    },
    isAll(){
        return this.countDone === this.todosAll && this.todosAll >0
        
    },
  }
 }

</script>

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

4.在同个文件夹下创建MyList.vue文件

<template>  
    <ul  class="todo-main">
        <MyItem 
           v-for="todoObj in todos" 
           :key="todoObj.id"  
           :todo="todoObj"  
           :checkTodo="checkTodo"
           :delectTodo="delectTodo">
        </MyItem>
    </ul>
</template>

<script>
import MyItem from './MyItem.vue'
export default {
    name:'MyList',
    components:{
        MyItem,
    },
    props:['todos','checkTodo','delectTodo']

}
</script>

<style scoped>
  .todo-main{
    margin-left:0px;
    border:1px 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>

5.再创建app.vue

<template>
  <div id="app">
    <div class="todo-container">
      <div class="todo-wrap">
    <!--放置静态资源-->
        <MyHeader :addtodos="addtodos"></MyHeader>
        <MyList 
           :todos="todos" 
           :checkTodo="checkTodo"
           :delectTodo="delectTodo">
          </MyList>
        <MyFooter 
           :todos="todos"
           :delectDone="delectDone" >
        </MyFooter>
      </div>
    </div>
  </div>
</template>

<script>
//所有组件放置的文件夹,除了app.vue 
import MyHeader from './components/MyHeader.vue'
import MyList from'./components/MyList.vue'
import MyFooter from './components/MyFooter.vue'

export default {
  name: 'App',
  components: {
    MyFooter,
    MyHeader,
    MyList
  },
  data(){
    return{
            todos:[
                {id:'001',title:'写代码',done:true},
                {id:'002',title:'看书',done:false},
                {id:'003',title:'休息',done:true}
            ],
            i:0,
            n:0
        }
  },
  methods:{
    //添加一个todo 
    addtodos(todoObj){  
      this.todos.unshift(todoObj)
    },
    //勾选或者取消勾选一个todo
    checkTodo(id){
      this.todos.forEach((todo)=>{
        if(todo.id ==id){
          todo.done=!todo.done
        }
      })
    },
    //删除对应的todo
    delectTodo(id){
     this.todos=this.todos.filter((todo)=>{
      console.log('运行到了这里')
      return todo.id !==id
     })
     console.log(this.todo.id,id)
    },
    //清除已经完成的内容
    delectDone(){
        this.todos=this.todos.filter((todo)=>{
        return todo.done === false
       })
    }
    
    
  },
}
</script>

<style>
/*basic*/ 
  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 o rgba(225,225,225,0.2) , 0 1px 2px rgba(0,0, 0, 0.2);
    border-radius: 4px;

  }
  .btn-danger{
    color:#fff;
    background-color:#da4f49;
    border:1px solid #bd362f;
  }
  .btn-danger:hover{
    color:#fff;
    background-color:#bd362f ;
  }
  .btn:foucs{
    outline:none;
  }
  .todo-container{
    width:600px;
    margin:0 auto;
  }
  .todo-container .todo-wrap{
    padding:10px;
    border:1px solid #ddd;
    border-radius: 5px;
  }
  

</style>

总结

1.组件化编码流程:

(1)拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突
(2)实现动态组件:考虑好数据的存放位置,数据是一个组件在用还是一些组件在用:
一个组件在用的话放在组件本身
一些组件在用的话放在对应的组件的父组件上
(3)实现交互:从绑定事件开始

2.props适合用于:

 (1)父组件向子组件通信
 (2)子组件向父组件通信

3.使用v-model的时候要记得:v-model绑定的数据的值不能是props中传递过来的数据,因为props不能修改

4,props传递的值如果是对象类型,那么改变对象中的属性的话,不会报错,但是不建议这么做。

5.获取框是否选中用e.target.checked (type=‘checked’),获取文本框的文字用e.target.value

6.可以使用过滤器来删除数组中不符合条件的组员

语法:arrs = arrs.filter((arr)={return 条件})

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

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

相关文章

机器学习 监督学习 Week2

Lib01 多变量线性回归 依旧是房价预测&#xff0c;但这次引入了多个变量&#xff0c;不仅仅只有房屋面积影响着房价&#xff0c;依旧尝试使用梯度下降算法找到最优的【w,b】&#xff0c;并且习惯使用向量点乘运算提高效率 import copy, math import numpy as np import matplot…

微内核和大内核

微内核和大内核是操作系统内核的两种不同设计思路。 图片来源 微内核 微内核是指将操作系统内核中的核心功能&#xff08;如进程管理、内存管理、设备驱动等&#xff09;作为独立进程运行&#xff0c;各进程间通过IPC(进程间通信)进行通讯。其中微内核相当于一个消息中转站&…

华为OD机试真题B卷 Java 实现【数据最节约的备份方法】,附详细解题思路

一、题目描述 有若干个文件&#xff0c;使用刻录光盘的方式进行备份&#xff0c;假设每张光盘的容量是500MB。 求使用光盘最少的文件分布方式&#xff0c;所有文件的大小都是整数的MB&#xff0c;且不超过500MB&#xff0c;文件不能分隔、分卷打包。 二、输入描述 每组文件…

AD PCB元器件封装设计方法

元器件封装界面 1.元器件可以新建PCB元件库&#xff0c;然后在新建的库中添加 2.也可以采用随便右键某个库中的元器件&#xff0c;选择“Edit…”&#xff0c;进入到元器件封装绘制界面。 元器件封装设计步骤 1.点击菜单栏工具——新的空元件&#xff1b;或者直接点击 Add&a…

认识.Net MAUI跨平台框架

.NET MAUI概念: 全称: .NET 多平台应用 UI (.NET MAUI) 是一个开源的跨平台框架&#xff0c;前身是Xamarin.Forms ! 用于使用 C# 和 XAML 创建本机移动和桌面应用。 NET MAUI&#xff0c;共享代码库,可在 Android、iOS、macOS 和 Windows 上运行的应用 应用架构: github 地址…

MySQL主从复制(概念和作用、实战、常见问题和解决办法、扩展、GTID同步集群、集群扩容、半同步复制)

文章目录 1. 主从复制1.1 概念和作用1.2 主从复制的步骤1.3 搭建主从同步&#xff08;配置步骤&#xff09;1.3.1 配置master主库1.3.2 配置slave从库1.3.3 主从复制的问题和解决方法1.3.4 MySQL主从复制监控和管理、测试 1.4 主从同步扩展1.4.1 主库同步与部分同步&#xff08…

【面试】操作系统面试题

操作系统面试题一 什么是操作系统&#xff1f;请简要概述一下 操作系统是管理计算机硬件和软件资源的计算机程序&#xff0c;提供一个计算机用户与计算机硬件系统之间的接口。 向上对用户程序提供接口&#xff0c;向下接管硬件资源。 操作系统本质上也是一个软件&#xff0…

Clion开发STM32之OTA升级模块(最新完整版)

前言 程序分为上位机部分、BootLoader、App程序上位机程序使用的是C#进行开发&#xff0c;目前只做成控制台部分开发环境依然选择Clion芯片采用的是stm32f103vet6升级模块已和驱动层逻辑进行分离 BootLoader程序 Flash分区定义 头文件 #ifndef STM32F103VET6_PROJECT_APP_FL…

图论-图的基本概念与数据结构

图的基本概念 无向图 边是没有方向的&#xff0c;也就是双向的 结点 V { v 1 , v 2 , . . . , v 7 } \mathcal{V} \{ v_1,v_2,...,v_7\} V{v1​,v2​,...,v7​} 边 ε { e 1 , 2 , e 1 , 3 , . . . , e 6 , 7 } \varepsilon \{e_{1,2},e_{1,3},...,e_{6,7}\} ε{e1,2​…

【面试】计算机网络面试题

计算机网络面试题一 简述OSI七层协议 OSI七层协议包括&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;运输层&#xff0c;会话层&#xff0c;表示层&#xff0c; 应用层 简述TCP/IP五层协议 TCP/IP五层协议包括&#xff1a;物理层&#xff0c;数据…

IntelliJ IDEA使用Alibaba Java Coding Guidelines编码规约扫描插件

代码规范和编码规约扫描插件使用 为什么要有代码规范&#xff1f;1.代码规范插件2.idea插件安装3.插件使用介绍编码规约扫描使用编码规约扫描结果 4.扫描结果严重级别BlockerCriticalMajor 5.《阿里巴巴Java开发手册&#xff08;终极版&#xff09;》 为什么要有代码规范&#…

HTTPS协议深入理解

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、HTTPS协议的由来及概念 二、加密是什么 三、HTTPS的工作流程 3.1 使用对称密钥 3.2 引入非对称加密 3.3 中间人攻击 3.4 引入证书 一、HTTPS协议的由来及概念 HTTPS 也是…

【chatGPT4结对编程】chatGPT4教我做图像分类

开始接触深度学习 大语言模型火了之后&#xff0c;我也想过是否要加入深度学习的行业当中来&#xff0c;一开始的想法就是AI大模型肯定会被各大厂垄断&#xff0c;我们作为普通应用型软件工程师直接调用api就完事&#xff0c;另外对自己的学历也自卑(刚刚够线的二本&#xff0…

2.4. 封装与访问控制

封装&#xff08;Encapsulation&#xff09;是面向对象编程的一个核心概念&#xff0c;它意味着将数据&#xff08;属性&#xff09;和方法&#xff08;操作数据的函数&#xff09;捆绑在一起&#xff0c;形成一个类&#xff08;Class&#xff09;。封装的目的是将数据和操作数…

C++插件管理类(下)——实际项目(阉割版)

文章目录 一、背景二、代码结构三、两个CMakeLists.txt3.1 父目录3.2 子目录src 四、代码实例4.1 main.cpp4.2 Plugin.h4.3 Plugin.cpp4.4 Comm.h4.5 calc.cpp 五、 踩坑点 一、背景 请参考C插件管理类(上) 二、代码结构 三、两个CMakeLists.txt 3.1 父目录 #设置cmake的最…

stackqueue的模拟实现

stack模拟&#xff1a; stack的源代码&#xff1a; stack的全部源代码就这些。 stack的代码少&#xff0c;原因在于采用了适配器模式&#xff0c;所谓适配器&#xff0c;以电器为例&#xff0c;每个电器都有电源适配器&#xff0c;中国的家用电源为220V的交流电&#xff0c;但是…

3d虚拟主播形象能提升提升企业销售额

随着科技的不断进步和发展&#xff0c;虚拟人形象正在被广泛地应用于商业宣传中。3D虚拟人形象是指采用计算机图形学、人工智能等技术&#xff0c;模拟真实人类形象的虚拟形象。相比于传统产品营销方式&#xff0c;采用3D虚拟人形象进行产品交互讲解对提升企业销售额具有很多优…

JavaWeb12(实现基础分页模糊查询的分页)

目录 一. 效果预览 ​编辑 二. 实现基本分页 2.1 分页sql --每页3条 取第二页 --由于伪列不能作用与大于符号也不能作用于between....and --因此需要将伪列----->名列 2.2 万能公式 2.3 首页&上一页&下一页实现 ②前端代码 2.4 末页实现&优化 ①底层代…

目标检测复盘 -- 6. YOLOv4

Backbone YOLOv4的骨干是CSPDarknet53 CSP结构的作用&#xff1a;1. 增强CNN的学习能力 2. 移出计算瓶颈 3. 减少内存开销 CSP首先将输入的特征层分成两个部分&#xff0c;这里以densenet为例&#xff0c;part2分支经过denseblock后&#xff0c;进过一个transition&#xff0c…

Redis之高可用方案浅析

在工程项目中&#xff0c;系统应用的高可用性越来越重要&#xff0c;业主越来越重视。其实高可用可以分为应用层高可用和数据层高可用&#xff0c;数据层高可用中常见的有关系型数据库mysql的高可用、非关系型NoSQl数据库redis的高可用等&#xff0c;下面聊聊典型的NoSQL数据库…