Vue技术之经典案例todolist

2023-10-31

前言

todolist案例在学习很多技术上都很适合新手练手。在这篇文章中将用Vue技术来实现该案例。此外感兴趣的小伙伴可以点击下方链接来获取案例源码哦!案例源码
链接:https://github.com/lingjing-wq/Vue-todolist

案例效果展示

在这里插入图片描述

案例功能介绍

  1. 任务的添加
  2. 任务的删除
  3. 任务的数量统计(已完成、总数量)
  4. 任务的状态切换(打钩or不打勾)
  5. 清除所用已完成的任务
  6. 任务的全选

案例主要技术

  1. Vue脚手架
  2. 模块化
  3. props的应用
  4. 组件通信
  5. Vue常用指令(v-for、v-bind、v-show等)
  6. Vue事件处理
  7. 计算属性

案例搭建过程

1. 首先使用脚手架新建项目

Vue create vue_test01

2. 切换到vue_test01文件夹下,并启动项目

cd vue_test01
npm run serve

3. 组件化案例
原则是根据案例的功能点来进行拆分。如下
在这里插入图片描述
将案例的骨架搭建好
在这里插入图片描述
4. 具体代码的实现

App.vue文件

<template>
  <div id="app">
    <div class="todo-container">
      <div class="todo-wrap">

        <MyHeader :receive="receive" />

        <MyList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo" />

        <MyFooter :todos="todos" :checkAllTodo='checkAllTodo' :clearAllTodo='clearAllTodo' />
      </div>
    </div>
  </div>
</template>

<script>
import MyHeader from './components/MyHeader.vue'
import MyList from './components/MyList.vue'
import MyFooter from './components/MyFooter.vue'
export default {
  name: 'App',
  components: {
    MyHeader,
    MyList,
    MyFooter
  },
  data() {
    return {
      todos: [
        { id: '001', title: '吃饭', done: true },
        { id: '002', title: '睡觉', done: false },
        { id: '003', title: '做事', done: true },
      ]
    }
  },
  methods: {
    //往对象数组中添加新的对象数据
    receive(e) {
      // console.log("收到数据了",e);
      this.todos.unshift(e);
      //勾选or取消勾选
    },
    //勾选or取消勾选
    checkTodo(id) {
      this.todos.forEach((todo) => {
        if (todo.id === id)
          todo.done = !todo.done;
      })
    },
    //删除
    deleteTodo(id) {
      this.todos = this.todos.filter((todo) => {
        return todo.id !== id;
      })
    },
    //全选or全不选
    checkAllTodo(done) {
      this.todos.forEach((todo) => {
        todo.done = done;
      })
    },
    //清除所有已完成的任务
    clearAllTodo() {
      this.todos = this.todos.filter((todo) => {
        return !todo.done
      })
    }
  },
}
</script>

MyHeader.vue文件

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

<script>
import { nanoid } from 'nanoid'
export default {
    name: 'MyHeader',
    //接收从APP内传来的函数receive
    props:['receive'],
    methods: {
        add(event) {
            // console.log(event.target.value)
            if(!event.target.value.trim()) return;//校验数据:输入不为空  &  trim()去掉前后空格
            //将用户的输入包包装成一个todo对象
            const todoObj = { id: nanoid(), title: event.target.value, done: false }
            // console.log(todoObj)
            this.receive(todoObj);//将需要添加的数据传给App
            //添加完后将值置为空
            event.target.value=''
        }
    },
}
</script>

MyList.vue文件

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

<script>
import MyItem from './MyItem.vue'

export default {
    name: 'MyList',
    components: {
        MyItem
    },
    //接收从App组件中来的数据
    props:['todos','checkTodo','deleteTodo']
}
</script>

MyItem.vue文件

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

<script>
export default {
    name: 'MyItem',
    //声明接受todo对象
    props: ['todo', 'checkTodo','deleteTodo'],//接收从MyList组件中传来的数据
    methods: {
        handleCheck(id) {
            // console.log(id)
            //通知APP组件将对应的todo对象的done值取反
            this.checkTodo(id)
        },
        //删除
        handledelete(id) {
            if(confirm('确定删除吗?')){
                // console.log(id);
                this.deleteTodo(id);
            }
        }
    },
}
</script>

MyFooter.vue文件

<template>
    <div class="todo-footer" v-show="todos.length"> 
        <label>
            <input type="checkbox" @change='checkAll'/>
        </label>
        <span>
            <span>已完成{{doneTotal}}</span> / 全部{{todos.length}}
        </span>
        <button class="btn btn-danger" @click="clearAll">清除已完成任务</button>
    </div>
</template>

<script>
export default {
    name: 'MyFooter',
    props:['todos','checkAllTodo','clearAllTodo'],
    computed:{
        doneTotal(){
            //计已完成的个数
            let i=0;
            this.todos.forEach((todo) => {
                if(todo.done)
                i++;
            });
            return i;
        }
    },
    methods:{
        checkAll(e){
            // console.log(e.target.checked)
            this.checkAllTodo(e.target.checked);
        },
        clearAll(){
            this.clearAllTodo();
        }
    },
}
</script>

案例总结

1.组件化编码流程:
(1). 拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突.
(2). 实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:
1). 一个组件在用:放在组件自身即可.
​ 2).一些组件在用:放在他们共同的父组件上(状态提升)。
(3). 实现交互:从绑定事件开始.

2.props适用于:
​ (1). 父组件——>子组件 通信
(2).子组件——>父组件通信(要求父先给子一个函数)
注意:
props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。

3.使用v-model时要切记:
v-model绑定的值不能是props传过来的值,因为props是不可以修改的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue技术之经典案例todolist 的相关文章

随机推荐

  • Qt QSqlQueryModel详解

    背景知识 Qt SQL的API分为不同层 驱动层 驱动层 对于QT是基于C 来实现的框架 该层主要包括QSqlDriver QSqlDriverCreator QSqlDriverCreatorbase QSqlDriverPlugin a
  • C4droid安装使用教程

    1 C4droid简介 手机 Android 上C C 的IDE 编译器 便携 功能强大 足以满足初学者平时的练习 汉化版 更易理解和使用 2 C4droid下载 在我分享的百度网盘链接中下载 https pan baidu com s 1
  • mysql yearweek函数_MySQL的YEARWEEK函数(转)_MySQL

    MySQL的YEARWEEK函数以及查询本周数据MySQL 的 YEARWEEK 是获取年份和周数的一个函数 函数形式为 YEARWEEK date mode 例如 2010 3 14 礼拜天 www bitsCN com SELECT Y
  • numpy:广播机制

    广播是numpy对不同形状的数组进行数值计算的方式 对数组的算术运算通常在相应的元素上进行的 如果两个数组a和b形状相同 即满足a shape b shape 那么a b的结果就是a与b数组对应位相乘 这要求维数相同 且各维度的长度相同 对
  • 2023华为OD机试真题【区块链转储系统】

    题目描述 区块链底层存储是一个链式文件系统 由顺序的N个文件组成 每个文件的大小不一 依次为F1 F2 Fn 随着时间的推移 所占存储会越来越大 云平台考虑将区块链按文件转储到廉价的SATA盘 只有连续的区块链文件才能转储到SATA盘上 且
  • Pandas中inf值替换

    文章目录 问题 出现inf的原因 解决办法 参考文章 问题 今天使用Pandas从MySQL读取数据 在处理之后再写回到数据库时报了一个错误 sqlalchemy exc ProgrammingError MySQLdb exception
  • mysql数据库 期末总结

    目录 数据库基础知识 MySQL命令 字符集 库操作 表操作 创建 查看和删除 修改表 复制表 约束控制 数据操作 插入数据 增 删除数据 删 修改数据 改 查询数据 查 单表查询 分组查询 排序 限制查询结果数量 集合函数 多表查询 1
  • Game of Primes (博弈)

    Game of Primes 题目链接 题意 初始有两个数 x 和 y 每次操作可以选择一个数减1 Alice和Bob轮流操作 指定某人先手 1 如果某时刻 x k 或 y k Bob胜 2 如果某时刻 x y都是素数 Alice胜 3 如
  • shell使用示例

    文章目录 shell使用示例 统计一个文本文件中每个单词出现的频率 打印文本文件的第十行 判断有效的电话号码 输出数字范围内7的倍数 shell使用示例 统计一个文本文件中每个单词出现的频率 cat text tr s n sort uni
  • Win11 文件夹打开慢或卡顿解决方案

    问题 目前是 2023 2 27 我的 Win11 系统点开一个文件夹要等待 2 3 秒才能加载出来 使用体验极差 网上查阅大量资料 有些人在系统更新后这个情况就消失了 但是我这一直存在 系统也是当前的最新版 没有修复 目前得出的结论是 因
  • 修改Maven的本地仓库位置

    最近开始学SSM整合项目视频时 需要用到Maven仓库于是便开始研究起了Maven 首先需要在官网下载Maven的压缩包 然后进行解压 再把其加入到环境变量中 由于主要研究的时Maven的如何修改仓库位置 所以这里就一笔带过 不知道如何配置
  • MySQL复习笔记-一条SQL更新语句是如何执行的?

    前面我们系统了解了一个查询语句的执行流程 并介绍了执行过程中涉及的处理模块 相信你还记得 一条查询语句的执行过程一般是经过连接器 分析器 优化器 执行器等功能模块 最后到达存储引擎 那么 一条更新语句的执行流程又是怎样的呢 之前你可能经常听
  • 简单的Markdown功能实现——marked模块的使用

    marked是一个markdown 解析 编译器 通过引入marked模块 可以实现一个简单的markdown编辑器 使用方式如下 Install 新建一个项目文件夹 在项目中下载marked模块 Usage 新建一个marked js文件
  • java 生成纯色图片_canvas简单实现纯色背景图片抠图(示例代码)

    最近在研究html5 canvas的过程中 发现 canvas为前端对图像的处理开辟了一条新的道路 canvas可以做到很多事情 甚至可以做个类似于PhotoShop的东西 曾经本人在一家软件工作就做类似的工作 可以看一下我之前开发的软件
  • 支付宝、微信Android APP支付接入流程

    支付类型 一次性支付 自动续费 支付宝周期扣款 微信委托扣款 1 支付并签约 2 先签约后扣费 注 微信委托扣款中先签约后扣费 自动续费 授权扣款 免密支付 支付宝 支付流程中各端交互逻辑 支付流程中商户APP端交互逻辑 先签约后扣费流程中
  • 深度学习笔记2:手写一个单隐层的神经网络

    欢迎关注天善智能 我们是专注于商业智能BI 人工智能AI 大数据分析与挖掘领域的垂直社区 学习 问答 求职一站式搞定 对商业智能BI 大数据分析挖掘 机器学习 python R等数据领域感兴趣的同学加微信 tsaiedu 并注明消息来源 邀
  • layout_weight属性的用法和意义

    一直没理解在LinearLayout中的layout weight属性的意义 使用的时候都是将子控件的layout width或者layout height设置为0 然后在设置layout weight的权重值 以至于在被问到如果设置了la
  • s3.GLSL学习之着色器基础

    着色器 着色器程序看起来确实和C语言非常类似 它们从入口点main函数开始 并且使用同样的字符集和注释约定 以及很多相同的处理指令 着色器是运行在GPU上的小程序 这些小程序为图形渲染管线的一个特定部分而运行 从基本意义上来说 着色器不是别
  • QT踩坑记录2-多线程信号与槽

    错误输出 无错误输出 但是声明了信号的连接 但是无法使用 程序中就是无命令 介绍 QT 典型程序 include
  • Vue技术之经典案例todolist

    文章目录 前言 案例效果展示 案例功能介绍 案例主要技术 案例搭建过程 案例总结 前言 todolist案例在学习很多技术上都很适合新手练手 在这篇文章中将用Vue技术来实现该案例 此外感兴趣的小伙伴可以点击下方链接来获取案例源码哦 案例源