Vue中TodoLists案例_底部交互

news2024/10/7 10:25:14

与上一篇Vue中TodoList案例_底部统计有俩个文件变化了

App.vue:定义了一个方法checkAllTodo,实现全选和取消全选,并将方法传给儿子组件MyFooter

<template>
  <div id="root">
    <div class="todo-container">
      <div class="todo-wrap">
        <MyHeader :addTodo="addTodo"/>
        <MyList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"/>
        <MyFooter :todos="todos" :checkAllTodo="checkAllTodo"/>
      </div>
    </div>
  </div>

</template>

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

export default {
  name:'App',
  components:{MyHeader,MyList,MyFooter},
  data(){
    return{
      todos:[
        {id:'001',title:'唱',done:true},
        {id:'002',title:'跳',done:false},
        {id:'003',title:'rap',done:true},
        {id:'004',title:'篮球',done:true}
      ]
    }
  },
  methods:{
    //添加一个todo
      addTodo(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
        })
    }
  }
}
</script>

<style>
/*base*/
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>

MyFooter.vue:使用props接收checkAllTodo方法,并且定义一个change改变事件,触发checkAll方法将参数通过checkAllTo传给App.vue,这里的(e.target.checked)值为true或false

<template>
  <div class="todo-footer" v-show="total">
    <label>
      <input type="checkbox" :checked="isAll" @change="checkAll"/>
    </label>
    <span>
           <span>已完成{{doneTotal}}</span> / 全部{{total}}
       </span>
    <button class="btn btn-danger">清除已完成的任务</button>
  </div>
</template>

<script>
export default {
  name: "MyFooter",
  props:[
      'todos',
      'checkAllTodo'
  ],
  computed:{
    total(){
      return this.todos.length
    },
    doneTotal(){
     /* const x = this.todos.reduce((pre,current)=>{
          console.log('@',pre,current)
          return pre+(current.done?1:0)
      },0)*/
      return  this.todos.reduce((pre,todo)=>pre+(todo.done?1:0),0)
    },
    isAll(){
      return this.doneTotal === this.total && this.total>0
    }
  },
  methods:{
    checkAll(e){
      this.checkAllTodo(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.vue:清除所有已经完成的任务,定义clearAllTodo函数传给儿子组件MyFooter

<template>
  <div id="root">
    <div class="todo-container">
      <div class="todo-wrap">
        <MyHeader :addTodo="addTodo"/>
        <MyList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"/>
        <MyFooter :todos="todos" :checkAllTodo="checkAllTodo" :clearAllTodo="clearAllTodo"/>
      </div>
    </div>
  </div>

</template>

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

export default {
  name:'App',
  components:{MyHeader,MyList,MyFooter},
  data(){
    return{
      todos:[
        {id:'001',title:'唱',done:true},
        {id:'002',title:'跳',done:false},
        {id:'003',title:'rap',done:true},
        {id:'004',title:'篮球',done:true}
      ]
    }
  },
  methods:{
    //添加一个todo
      addTodo(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
        })
    },
    //清除所有已经完成的todo
    clearAllTodo(){
      this.todos = this.todos.filter((todo)=>{
        return !todo.done
      })
    }
  }
}
</script>

<style>
/*base*/
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>

MyFooter.vue:改良全选取消全选(v-model绑定isAll函数,利用其中set()get()方法进行操作)。定义点击事件clearAll调用clearAllTodo

<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',
      'checkAllTodo',
      'clearAllTodo'
  ],
  computed:{
    total(){
      return this.todos.length
    },
    doneTotal(){
     /* const x = this.todos.reduce((pre,current)=>{
          console.log('@',pre,current)
          return pre+(current.done?1:0)
      },0)*/
      return  this.todos.reduce((pre,todo)=>pre+(todo.done?1:0),0)
    },
    isAll:{
      get(){
        return this.doneTotal === this.total && this.total>0
      },
      set(checked){
        this.checkAllTodo(checked)
      }
    }
  },
  methods:{
    clearAll(){
      this.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>

 

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

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

相关文章

数学建模学习(4):TOPSIS 综合评价模型及编程实战

一、数据总览 需求&#xff1a;我们需要对各个银行进行评价&#xff0c;A-G为银行的各个指标&#xff0c;下面是银行的数据&#xff1a; 二、代码逐行实现 清空代码和变量的指令 clear;clc; 层次分析法 每一行代表一个对象的指标评分 p [8,7,6,8;7,8,8,7];%每一行代表一个…

JDK、JRE、JVM三者之间的关系

总结 JDK包含JRE&#xff0c;JRE包含JVM。 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…

解决 前端显示后端返回的null值为 1的问题

一 、问题描述 一个产品信息&#xff0c;有一个输入框的数据是后端返回回显出来的 但是后端返回这个字段时候&#xff0c;这个字段为空值&#xff0c;在后端就根本在data中没有返回这个字段任何信息 如返回的data {name : 123,age: 18} 因为age 为空&#xff0c;实际后端返回…

云原生|kubernetes|kubernetes集群部署神器kubekey安装部署高可用k8s集群(半离线形式)

前言&#xff1a; 云原生|kubernetes|kubernetes集群部署神器kubekey的初步使用&#xff08;centos7下的kubekey使用&#xff09;_晚风_END的博客-CSDN博客 前面利用kubekey部署了一个简单的非高可用&#xff0c;etcd单实例的kubernetes集群&#xff0c;经过研究&#xff0c;…

pt19盒模型布局

CSS 盒模型 内容尺寸overflow(占用内容框) 一般情况下&#xff0c;为元素设置width/height&#xff0c;指定的是内容框的大小 内容溢出&#xff1a;内容超出元素的尺寸范围&#xff0c;称为溢出。默认情况下溢出部分仍然可见&#xff0c;可以使用overflow调整溢出部分的显示…

【枚举】CF1833 D

Problem - D - Codeforces 题意&#xff1a; 给定一个序列&#xff0c;让你找一个区间&#xff0c;翻转区间内的数&#xff0c;交换前缀和后缀&#xff0c;让结果数组的字典序最大 思路&#xff1a; 观察样例可知&#xff0c;r是可以直接确定的&#xff0c;l是不确定的&…

使用Docker构建Nginx镜像并部署Web应用

文章目录 1. 简介2. 准备工作3. 编写Dockerfile4. 编写nginx.conf5. 构建镜像6. 查看镜像是否构建成功7. 运行容器8. 访问Web应用9. 总结 1. 简介 Docker是一个开源的容器化平台&#xff0c;它可以帮助我们快速构建、发布和运行应用程序&#xff0c;实现应用程序的环境隔离和依…

DevOps初识

博主入职了&#xff0c;正在学习一些在学校没有接触过的东西&#xff0c;在此进行记录~~~~ 背景 随着软件发布迭代的频率越来越高&#xff0c;传统的「瀑布型」&#xff08;开发—测试—发布&#xff09;模式已经不能满足快速交付的需求。打破开发和运维的壁垒&#xff0c;聪…

K8S初级入门系列之三-Pod的基本概念和操作

一、前言 Pod的原意是豌豆荚的意思&#xff0c;一个豆荚里面包含了很多豆子。在K8S中&#xff0c;Pod也是类似的意思&#xff0c;只不过这里的豆子就是容器。在K8S初级入门系列之一-概述中&#xff0c;我们对Pod有个初步的了解。 1、Pod是K8S编排和调度的最小基础单元。 了解容…

ChatGPT助力校招----面试问题分享(十二)

1 ChatGPT每日一题&#xff1a;运算放大器与比较器的区别 问题&#xff1a;运算放大器与比较器的区别 ChatGPT&#xff1a;运算放大器和比较器都是电子电路中常用的模拟电路元件&#xff0c;但它们的设计和应用略有不同。下面是两者的主要区别&#xff1a; 功能不同&#xf…

微服务——Nacos配置管理

目录 Nacos配置管理——实现配置管理 配置管理实践 Nacos配置管理——微服务配置拉取 Nacos配置管理——配置热更新 方式一: ​编辑 方式二(推荐方式): Nacos配置管理——多环境配置共享 优先级问题 Nacos配置管理——nacos集群搭建 总结​编辑 Nacos配置管理——实现配置管…

Linux 云服务器上部署 web 项目

目录 1)安装 jdk 2)安装 tomcat 3) 设置安全组 4)安装mysql 5) 建库建表 6) 打包部署 1)安装 jdk 使用包管理器进行安装 常用的包管理器 yum (centos 自带的包管理器) apt pacman 我们使用 yum 来进行安装程序 yum list 查看当前的软件包有哪些 命令: yum list | gre…

Oracle 列出一天内每5分钟一条数据

select trunc(sysdate) (rownum-1) / (24*60/5) time from dual connect by rownum < 24*60/5效果如图&#xff0c; 类似的 列出一年内每天、每个月也是用connect by搭配rownum使用

记一次Mysql慢SQL优化过程

缘起 最近有个同事让我看看一个测试环境的SQL&#xff0c;因为这个SQL执行了几十秒&#xff0c;导致接口超时了。 sql为(里面表名已经使用test_table开头的表名脱敏&#xff0c;返回的字段使用*脱敏&#xff0c;别名未修改)&#xff1a; select* fromtest_table1 e join test…

分布式文件存储与数据缓存 FastDFS

一、FastDFS概述 1.1 什么是分布式文件系统 单机时代 初创时期由于时间紧迫&#xff0c;在各种资源有限的情况下&#xff0c;通常就直接在项目目录下建立静态文件夹&#xff0c;用于用户存放项目中的文件资源。如果按不同类型再细分&#xff0c;可以在项目目录下再建立不同的…

【Linux -- systemctl管理服务】

Linux – systemctl管理服务 文章目录 Linux -- systemctl管理服务一、通过systemctl管理单一服务(service unit)二、通过systemctl查看系统上所有的服务三、通过systemctl管理不同的操作环境(target unit)四、通过systemctl分析各服务之间的依赖性总结 一、通过systemctl管理单…

ssh打开远程vscode

如果想要远程打开其他终端的vscode&#xff0c;首先要知道远程终端的ip地址和用户名称以及用户密码 1、打开本地vscode 2、点击左下角蓝色区域 3、页面上部出现如下图&#xff0c;点击ssh&#xff0c;我这里已经连接&#xff0c;所以是connect to host 4、选择Add New SSH Host…

系统架构设计师-软件架构设计(1)

目录 一、软件架构的概念 1、架构的本质 2、架构的作用 二、架构发展历史 三、架构的 “4 1” 视图 1、逻辑视图&#xff08;Logical View&#xff09; 2、开发视图&#xff08;Development View&#xff09; 3、进程视图&#xff08;Process View&#xff09; 4、物理视图…

Python操作文件:从入门到“悟”

一、打开文件 Python里面打开文件可以使用内置的open函数。 open函数的定义如下&#xff1a; def open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue): # known special case of open常用参数介绍&#xff1a; file&#xff1a;指定要打…

苹果账号被禁用怎么办

转载&#xff1a;苹果账号被禁用怎么办 目录 禁用的原因 解除Apple ID禁用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKQ1ILhC-1689932607373)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw)]​编辑 …