vue实现todoList_vue制作todolist-程序员宅基地

技术标签: vue  html  javascript  

三部分实现todoList

//todoHeader组件
<template>
    <div>
    	//数据双向绑定,trim去除空格,keyup实现按回车键添加一条todo列表
        <input v-model.trim="text" @keyup.enter="addTodo">
        <button @click="addTodo">addtodo</button>
    </div>
</template>

<script>
export default {
    data(){
        return{
            text:""
        }
    },
    methods:{
        addTodo(){
        //输入框有内容才能发送
            if(this.text){
            	//自定义一条todo,id为时间戳
                let todo={id:+new Date(),text:this.text,completed:false}
                //这里使用子组件反向传值修改父组件的值,把自定义的todo传过去
                this.$emit("add-todo",todo)
            }
            //输入完内容再清空输入框
            this.text=""
        }
    }
}
</script>
//todoList组件
<template>
    <div>
    //动态绑定class,todo处于完成状态时添加completed类名
        <div v-for="todo in todos" :key="todo.id" :class="{completed:todo.completed}">
        //动态绑定复选框勾选属性,根据todo已完成未完成状态
            <input type="checkbox" :checked="todo.completed" 
            //改变输入内容时自动触发,也是反向传值修改父组件,切换完成状态
            @change="$emit('toggle-completed',todo.id)"/>
            {
   {todo.text}}
            //删除一条todo,同样反向传值
            <button @click="$emit('remove-todo',todo.id)">删除</button>
        </div>
    </div>
</template>

<script>
export default {
	//接受父组件传递过来的todos列表
    props:["todos"],
}
</script>

<style scoped>
  .completed{
      color:#ccc;
      text-decoration: line-through;
  }
</style>

//todoFilter组件
<template>
    <div class="filter-box">
    //切换所有todo,未完成todo,已完成todo状态,根据filter的值切换当前状态,点击时候触发的切换也是通过反向传值
        <span class="filter-btn" :class="{active:filter===0}" @click="$emit('set-filter',0)">All</span>
        <span class="filter-btn" :class="{active:filter===1}" @click="$emit('set-filter',1)">Active</span>
        <span class="filter-btn" :class="{active:filter===2}" @click="$emit('set-filter',2)">Completed</span>
    </div>
</template>

<script>
export default {
//接受父组件传递过来的filter
    props:["filter"]
}
</script>

<style scoped>
    .filter-box{
        margin-top:10px;
    }
    .filter-btn{
        display:inline-block;
        border:1px solid #ccc;
        padding:3px;
        margin-left:10px;
        color:#ccc;
    }
    .active{
        border:1px solid blue;
        color:blue;
    }
</style>
//App.vue应用主组件
<template>
  <div id="app">
  	//使用组件,并定义自定义事件
    <TodoHeader @add-todo="addTodo"></TodoHeader>
    //注意,这里之前是:todos="todos",现在换成了计算属性的toggleTodo
    <TodoList :todos="toggleTodo" @remove-todo="removeTodo" @toggle-completed="toggleCompleted"></TodoList>
    <TodoFilter :filter="filter" @set-filter="setFilter"></TodoFilter>
  </div>
</template>
<script>
//引入三个组件
import TodoList from "./components/TodoList"
import TodoHeader from "./components/TodoHeader"
import TodoFilter from "./components/TodoFilter"
export default {
  data(){
    return{
    //存储todos原数据
      todos:[
        {id:0,text:"好好学习",completed:true},
        {id:1,text:"天天向上",completed:true},
        {id:2,text:"热爱生活",completed:false},
        {id:3,text:"酷爱运动",completed:true},
      ],
      //定义filter初始值
      filter:0
    }
  },
  computed:{
  //使用计算属性来监听todo状态变化,达到切换所有todo的所有,未完成和已完成状态
    toggleTodo(){
      return this.todos.filter(todo => {
      //当filter为1的时候就是展示未完成的todo
        if(this.filter === 1){
          return !todo.completed
        }
        //filter为2的时候展示已完成的todo
        if(this.filter === 2){
          return todo.completed
        }
        //默认展示所有的todo
        return true
      })
    }
  },
  methods:{
  //添加一条todo方法
    addTodo(todo){
      this.todos.push(todo)
    },
    //切换todo的已完成未完成状态
    toggleCompleted(id){
    //map修改数组的一项或多项
      this.todos=this.todos.map(todo => {
      //如果todo.id等于传进来的id就修改
        if(todo.id === id){
        //保留原todo,修改todo状态
          return {...todo,completed:!todo.completed}
        }
        return todo
      })
    },
    //删除一条todo
    removeTodo(id){
    //filter过滤,实现删除功能,把当前点击的id相等的todo删掉
      this.todos=this.todos.filter(todo => todo.id != id)
    },
    //设置filter的值为当前传递的值
    setFilter(filter){
        this.filter = filter
    }
  },
  components:{
  //注册组件
    TodoList,
    TodoHeader,
    TodoFilter
  },

}
</script>
<style>

</style>

以下为效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wo139472/article/details/107289745

智能推荐

拓扑序列(拓扑排序)-程序员宅基地

拓扑排序是对有向图中节点进行排序的算法,要求节点之间不存在环。通过统计入度为0的节点并将其指向的节点入度减一,依次进行操作,直到所有节点都被分离出来。如果最后不存在入度为0的节点,则说明存在环。

[计算机毕业设计]MATLAB的人脸识别-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏23次。计算机毕业设计之matlab人脸识别:在过去的十年中已经提出了几种用于图像处理和计算机视觉应用的机器学习算法。LBP,HAAR是一些流行的算法,广泛用于人脸识别并产生出色的结果。但是大多数这些算法不适合在无约束环境中进行实时识别。最近最先进的深度学习技术已经成为传统机器学习算法的新宠。人脸识别应用程序使用的图像只是范围(0-255)中像素值的组合。算法在那些灰度值中找到区别模式并将其视为被认为对于每个图像唯一的特征。然而在3D图像中,不存在像素信息,而是仅每个点的位置(x,y,z)可用。

习题6-5 使用函数验证哥德巴赫猜想 (20分)_6-5 使用函数验证哥德巴赫猜想 (20 分) 本题要求实现一个判断素数的简单函数,并利-程序员宅基地

文章浏览阅读185次。本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。函数接口定义:int prime( int p );void Goldbach( int n );其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数..._6-5 使用函数验证哥德巴赫猜想 (20 分) 本题要求实现一个判断素数的简单函数,并利

Ubuntu键盘鼠标失灵_ubuntulinux鼠标雄安是-程序员宅基地

文章浏览阅读3.9k次。近期不知安装了什么package,导致 ubuntu 开机后键盘鼠标一直没法用,刚开始以为是 ubuntu 桌面环境崩溃了,后来发现系统能显示连接到网络、时间也在运行,那应该就是键盘鼠标失灵了。网上查了一下,应该是 xserver-xorg-input-all 包被删除了,重新安装一下就可以了!方法如下:重启系统按 Esc 进入 grup 引导界面,选择 Advanced Option,再选择 recovery mode,按 Enter 进入选择 resume 进入,屏幕左上角会出现一直闪烁的_ubuntulinux鼠标雄安是

设计删除顺序表中【x,y】中的所有元素算法_关任务:设计一个高效的用于删除整数顺序表 l 中所有值在[x,y]范围内的元素的-程序员宅基地

文章浏览阅读8.9k次,点赞2次,收藏15次。线性表L采用顺序存储结构,删除元素在[x,y]之间的所有元素。代码如下:#include #include using namespace std;#define MaxSize 10typedef char ElemType;typedef struct{ ElemType data[MaxSize]; int length;}SqList;void In_关任务:设计一个高效的用于删除整数顺序表 l 中所有值在[x,y]范围内的元素的

pandas 取excel 中的某一列_Pandas进阶修炼120题,给你深度和广度的船新体验-程序员宅基地

文章浏览阅读1.2k次,点赞3次,收藏23次。Pandas 是基于 NumPy 的一种数据处理工具,该工具为了解决数据分析任务而创建。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的函数和方法。和鲸社区的@刘早起同学创作了这个项目,其中包含Pandas基础、Pandas数据处理、金融数据处理、当Pandas遇上NumPy、补充内容 5个部分。在深度和广度上,都相较之前的Pandas习题系列有了很大的提升。此前的..._在运用pandas进行数据分析时,可以用df.append(df.iloc[7])将第8行数据添加到末尾

随便推点

【Mybatis源码解析第九章】说说Mybatis中的ExecutorType_mybatis executortype-程序员宅基地

文章浏览阅读2.5k次。缘起在使用mybatisplue的过程中,发现如果一个事务中执行了插入又执行了批量插入的话就会报错Cannot change the ExecutorType when there is an existing transaction[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFLCqrsB-1582688327549)(http://www.bxoon...._mybatis executortype

java开发操作系统:同时运行多窗口多任务_java jni 同时管理多个窗口-程序员宅基地

文章浏览阅读1.8k次。创建操作系统的多窗口多进程功能_java jni 同时管理多个窗口

ElasticSearch 字段数据存在,但用term查询搜索不到指定的数据_elasticsearch中match查询和term不可用-程序员宅基地

文章浏览阅读6.1k次,点赞11次,收藏13次。近日使用ElasticSearch查询数据时遇到了个问题,在es中该字段对应的数据是存在的,但使用term/terms查询时却查不到。同时,我使用match去查询却能查到:match能查到而term查不到,用过es的都应知道这两者的查询是有区别的:match是全文搜索,用于查询字段类型为text的字段,match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配;而term是精确查询,也就是完全匹配,通常用于对keyword和有精确值的字段进行查询,搜索前不会再对搜索词进行分词拆解。由上面的._elasticsearch中match查询和term不可用

人工智能_机器学习059_非线性核函数_poly核函数_rbf核函数_以及linear核函数效果对比---人工智能工作笔记0099_linear、 poly、rbf-程序员宅基地

文章浏览阅读595次。X += np.random.randn(100,2) 我们从正太分布中拿出100行2列的数据来,拼接到X生成的100行2列的数据里面,现在的原来的X,就变成了。- `X[:,0]`:这是第一个维度(通常是x轴)的值,X 是一个二维数组,`X[:,0]` 表示取X数组的第一列。- `X[:,1]`:这是第二个维度(通常是y轴)的值,X 是一个二维数组,`X[:,1]` 表示取X数组的第二列。这个是5,5 表示图形的大小,x轴,y轴的大小,设置好以后生成的就圆了,要不然是椭圆的,可以看到上面显示的._linear、 poly、rbf

excel取整函数_Excel中-年会必备,教你制作简易抽号系统-程序员宅基地

文章浏览阅读173次。【回顾敲黑板】先把上一期留下来的2个问题解决,这个抽号系统你就有思路了~1、如何让随机数变为整数?【答】使用int()函数,用法就是把:Rand()*10直接放到int()里,即:int(Rand()*10)2、如何去某个固定区间的随机数,比如【0-30】?【答】若要生成 a 与 b 之间的随机实数,应使用: RAND()*(b-a)+a,即RAND()*(30-0)+(0)。脑袋里是不是一团数学..._如何制作抽号

爬虫实战——爬取电影天堂的电影详情页信息_2、请使用不同的爬虫库爬取网站电影信息页面-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏12次。爬取电影天堂的电影详情页信息_2、请使用不同的爬虫库爬取网站电影信息页面