Vue(七) TodoList案例1.0

文章目录

  • 组件化编码流程(通用)
  • 1. 拆分静态组件
  • 2. 初始化列表
    • 展示动态数据
    • 如何让一个标签动态的拥有某一个属性
  • 3. 按回车添加todo
    • 子组件给父组件传值之props
  • 4. 勾选与取消勾选一个Todo
  • 5. 删除
  • 6. footer底部统计
  • 7. footer底部交互
    • 7.1 全选框自动打勾
    • 7.2 全选框取消勾选
  • 8. 清除已完成任务
  • 总结

组件化编码流程(通用)

1、实现静态组件:抽取组件,使用组件实现静态页面效果

2、展示动态数据:

  • 数据的类型、名称是什么
  • 数据保存再哪个组件

3、交互–从绑定事件监听开始

如果组件名字不好起,想一下是不是组件拆分的不合理

1. 拆分静态组件

根据功能,可划分为以下几个组件:
在这里插入图片描述
将已写好页面的html,css根据组件进行拆分,得到的文件结构如下:
App组件里使用了MyHeader、MyList、MyFooter组件
在这里插入图片描述
MyList组件里使用了MyItem组件:
在这里插入图片描述

2. 初始化列表

展示动态数据

(1) 确定数据名称、数据类型
数据名称:这一堆的代办事项数据名称可以叫todos,
数据类型:最好用数组存储这一堆的待办事项,而每一个代办事项可以用对象存储。

(2) 数据保存在哪个组件:
谁用这些数据,就写在哪个组件里后续如果有变化,再改变位置。因此暂时写在MyList组件里。
MyList.vue

<template><ul class="todo-main"><!-- 循环生成多个MyItem,且将具体的代办事项传递给MyItem,否则还是页面的列表里还是yyyy--><MyItem v-for="toboObj in todos" :key="toboObj.id" :todo="toboObj" /></ul>
</template>
<script>
...data () {return {todos: [{ id: '0001', title: '吃饭', done: true },{ id: '0002', title: '睡觉', done: true },{ id: '0003', title: '打豆豆', done: false }]}}
</script>

MyItem.vue

<template><li><label><!-- 添加checked属性,初始化复选框的数据 --><input type="checkbox" checked /><span>{{ todo.title }}</span></label><button class="btn btn-danger" style="display: none">删除</button></li>
</template><script>
export default {name: 'MyItem',// 接收MyList组件传递的对象props: ["todo"]
}
</script>

但是添加checked后,所有的复选框都被勾选了。

如何让一个标签动态的拥有某一个属性

答:v-bind动态绑定

  <input type="checkbox" :checked="todo.done" />

在这里插入图片描述

3. 按回车添加todo

输入框在Header组件中,因此Header组件中要添加点击事件

<template><div class="todo-header"><!-- v-model获取表单元素的值 --><input type="text" placeholder="请输入你的任务名称,按回车键确认" v-model="title" @keydown.enter="add"/></div>
</template>

add回调函数中要做以下几件事:

import { nanoid } from 'nanoid'
methods: {add () {// 1. 获取到表单元素的内容console.log(this.title); // 或者通过 e.target.value获取到输入框的内容// 2. 将用户的输入包装成一个todo对象const todoObj = { id: nanoid(), title: this.title, done: false }  // 3. 将todo对象添加到todo列表里,即todos数组中// 4. 输入框内容置空。this.title = '' // 或者 e.target.value = '' }
}
  • nanoid
    包装的对象应该有一个唯一的id,uuid这个库可以生成全球唯一的编码,但是太大且生成的编码复杂。采用uuid的精简版:nanoid

    安装npm i nanoid
    引用 import {nanoid} from 'nanoid'
    使用: nanoid()(这是个函数,直接调用即可)

  • todoObj在MyHeader组件里,而数据todos在MyList组件里。两组件为兄弟组件,目前还不会兄弟组件之间通信。所以还是采用props属性。
    为了方便MyHeader通信,将todos改放在App组件里,而不是MyList组件里。此时:
    在这里插入图片描述

App可通过props将todos交给MyList组件进行展示。MyHeader该如何将todoObj交给父组件App呢?

子组件给父组件传值之props

父组件给子组件传递带参的函数

<!--App.vue-->
<template>...<!-- 给子组件传函数 --><MyHeader :addTodo="addTodo"></MyHeader><!-- 给子组件传数据 --><MyList :todos="todos"></MyList><MyFooter></MyFooter>...
</template>
<script>methods: {// 添加todoObjaddTodo (todoObj) {this.todos.unshift(todoObj)}}
}
</script>

子组件接收函数

<!--MyHeader.vue-->
<script>props: ["addTodo"],methods: {add () {//完善一下:校验数据if (!this.title.trim()) return alert('输入不能为空')const todoObj = { id: nanoid(), title: this.title, done: false }// 调用函数,通过参数将todoObj传递给父组件this.addTodo(todoObj)this.title = ''}}
}
</script>

总结:子组件向父组件传值时,父组件需提前向子组件传递一个带参的函数,子组件通过函数的参数将数据传给父组件。

捋顺一下流程:
1、按下回车,执行MyHeader里的add函数,在add里调用了App组件里的addTodo函数。
2、addTodo函数修改了App组件中data里的todos数据。
3、Vue捕获到todos变了,于是重新解析App里的template模板,重新解析时,将变化后的todos交给了MyList组件。
4、MyList收到数据,重新解析自己组件内的模板,v-for,虚拟DOM对比,更新页面。

4. 勾选与取消勾选一个Todo

在这里插入图片描述

MyItem.vue添加change事件(@click也可以)

  <input  type="checkbox"  :checked="todo.done" @change="handleCheck(todo.id)" />

handleCheck事件里需要对todos数据进行修改。数据在App组件里, 数据在哪里,操作数据的方法就在哪里,所以这里需要把待修改的todo的id传递给App。子组件给父组件传值,父组件需要先传递一个带参函数。此处应该是App传给MyList,MyList再传递给MyItem。

App.vue

<template>
...<!-- 先将函数传递给MyList --><MyList :todos="todos" :checkTodo="checkTodo"></MyList>
...
<script>// 勾选or取消勾选一个todocheckTodo (id) {this.todos.forEach((todo) => {if (todo.id === id) {todo.done = !todo.done}})}
</script>

MyList.vue

  <MyItem   v-for="toboObj in todos" :key="toboObj.id" :todo="toboObj"  :checkTodo="checkTodo" />
<script>props: ["todos", "checkTodo"]
</script>

MyItem.vue

// 接收MyList组件传递的对象
props: ["todo", "checkTodo"],methods: {handleCheck (id) {this.checkTodo(id)}
}

需要注意的是:
:checked="todo.done" ----初始化复选框
@change="handleCheck(todo.id) ----更新复选框
这两个操作可用v-model进行合并

<!-- 这行代码也能实现,但是有点儿违反原则,因为这样修改了props里数据的值,不报错是因为,todo是个对象,地址值没被修改, --> 
<input type="checkbox" v-model="todo.done" />

5. 删除

在这里插入图片描述
点击按钮,获取当前MyItem的id,根据id删除该条数据。同样的套路

添加监听事件,监听事件里调用父组件传递过来的函数。通过父组件里的这个函数对todos进行删除操作。
App.vue:

<MyList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></MyList>
<script>// 删除一个tododeleteTodo (id) {this.todos = this.todos.filter((todo) => {return todo.id !== id})}
</script>

MyList.vue:

<MyItem
v-for="toboObj in todos"
:key="toboObj.id"
:todo="toboObj"
:checkTodo="checkTodo"
:deleteTodo="deleteTodo"
/>
<script>props: ["todos", "checkTodo", "deleteTodo"]
</script>

MyItem.vue:

<button class="btn btn-danger" @click="handleDelete(todo.id)">删除</button>
<script>handleDelete (id) {// 弹框if (confirm('确定要删除吗?')) {// 通知App,删除对应的todothis.deleteTodo(id)}}
</script>

在这里插入图片描述

6. footer底部统计

在这里插入图片描述

<!--Footer.vue--> 
<!--使用计算属性--> 
<span>已完成{{ doneTotal }}</span> / 全部{{ total }}
<script>props: ["todos"],computed: {total () {return this.todos.length},doneTotal () {// reduce记数return this.todos.reduce((prev, cur) => {return prev + (cur.done ? 1 : 0)}, 0)// 简写// return this.todos.reduce((prev, current) => prev + (current.done ? 1 : 0))}
</script>

7. footer底部交互

这里结合6底部统计一起看

7.1 全选框自动打勾

如果代办事项全都选上,则该框自动打勾,
在这里插入图片描述

<input type="checkbox" :checked="isAll" @change="checkAll" />
<script>computed: {isAll () {// 已完成的数量是否等于todos的总数return this.doneTotal === this.total}},
</script>  

但是这样有个问题:
在这里插入图片描述
改进:

isAll () {return this.doneTotal === this.total && this.total > 0
}

优化:当没有代办事项时,footer组件不应该显示
在这里插入图片描述

7.2 全选框取消勾选

方式一:添加点击事件
App组件中创建操作todos的函数并传递给子组件
在这里插入图片描述
子组件接收函数并调用
在这里插入图片描述
方式二:v-model
(注意此处与 第4节的勾选与取消勾选一个Todo的区别)

<!-- :check = "isAll"用于初始化复选框
@change="checkAll"用来更新复选框
-->
<input type="checkbox" :checked="isAll" @change="checkAll" />
<!-- 简写为 -->
<input type="checkbox" v-model="isAll" />

由于isAll是计算属性,且v-model是双向绑定,所以当操作复选框时,对isAll的值进行了修改;
在这里插入图片描述
所以此时isAll不能采用简写形式了

isAll: {get () {return this.doneTotal === this.total && this.total > 0},set (value) {this.checkAllTodo(value)}
}

8. 清除已完成任务

在这里插入图片描述

添加点击事件
MyFooter.vue

<button class="btn btn-danger" @click="clearAll">清除已完成任务</button>
<script>
props: ["todos", "checkAllTodo", "clearAllTodo"],
clearAll () {this.clearAllTodo()
}
</script>

App.vue

<MyFooter:todos="todos":checkAllTodo="checkAllTodo":clearAllTodo="clearAllTodo"
></MyFooter>
<script>
// 清除所有已完成的todoclearAllTodo () {this.todos = this.todos.filter((todo) => {return !todo.done})}
</script>

总结

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

    ​ (1).父组件 ==> 子组件 通信

    ​ (2).子组件 ==> 父组件 通信(要求父先给子一个函数)

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

  3. props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。

项目完整代码链接:https://gitee.com/LXHST/vue2–Todo-list-case-1.0/tree/master/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是短视频矩阵?一个人能做好短视频矩阵营销吗?

很多人认为做短视频矩阵就是多账号、多发视频就可以了&#xff0c;但其实做短视频矩阵&#xff0c;并不仅仅是更多账号更多视频那么简单&#xff0c;它的核心在于搭建一个全方位的内容传播方式。这种方式包括三个方面&#xff1a;账号矩阵、平台矩阵和内容矩阵。 首先是账号矩阵…

SnailJob:分布式环境设计的任务调度与重试平台!【送源码】

背景 近日挖掘到一款名为“SnailJob”的分布式重试开源项目,它旨在解决微服务架构中常见的重试问题。在微服务大行其道的今天&#xff0c;我们经常需要对某个数据请求进行多次尝试。然而&#xff0c;当遇到网络不稳定、外部服务更新或下游服务负载过高等情况时&#xff0c;请求…

emmc协议

一、简介 1.1 简介 嵌入式多媒体卡&#xff08;Embedded Multimedia Card, eMMC&#xff09;是由 JEDEC 协会所订立&#xff0c;将 MMC controller 和 NAND Flash 封装到一个芯片中&#xff0c;简化存储器的使用和电路板的设计。 1.2 信号 singledescriptionclkclockdata…

【Spring Boot-IDEA创建spring boot项目方法】

1. 使用Spring Initializr 的 Web页面创建项目 2. 使用 IDEA 直接创建项目&#xff0c;其中有两种不同的搭建路径 3. 使用 IDEA 创建Maven项目并改造为springBoot 最常使用的两种方法其实就是一种&#xff0c;这里介绍在ieda中如何搭建 SpringBoot项目。 1.new Project--> 2…

恒电流间歇滴定法 (GITT) 测试教程

文章目录 恒电流间歇滴定法 (GITT) 测试教程1. GITT 测试原理2. 实验准备2.1 设备与材料2.2 配置实验装置 3. GITT 测试步骤3.1 设定测试参数3.2 执行 GITT 测试 4. 数据分析4.1 电压变化分析4.2 扩散系数计算4.3 电荷传输阻抗分析 5. 总结与应用 恒电流间歇滴定法 (GITT) 测试…

Java18 设计模式

第十八节&#xff1a;设计模式 1.设计模式概述 1.1软件设计模式的产生背景 ​ "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;…

安卓开发环境搭建1

1、参考地址&#xff1a;Android开发环境搭建_kiba518的博客-CSDN博客 安装jdk 安装Android.Studio 2、就这样&#xff0c;next&#xff0c;搞定安卓开发环境&#xff0c;耗时20分钟 3、参考视频&#xff1a; 三&#xff1a;Android Studio安装_哔哩哔哩_bilibili 1.手机设…

XSS漏洞

本质 变量在接收数据时&#xff0c;数据被写成js脚本&#xff0c;然后进行回显操作&#xff0c;就被浏览器执行&#xff1b;js可以干什么&#xff0c;这个漏洞就可以干什么 产生层面 前端 函数类 echo… 漏洞操作对应层 危害影响 js代码决定 浏览器内核版本 版本是否支持执…

Ubuntu Linux Server安装Kubernetes

本文主要描述在Ubuntu Linux Server操作系统中安装Kubernetes云原生对应的microk8s组件。 sudo snap install microk8s --classic 如上所示&#xff0c;在Ubuntu服务器中安装microk8s组件完成&#xff0c;对应的版本是microk8s v1.30版本 microk8s enable dashboard 如上所…

ISIS路由渗透

/ 实验介绍: / 原理概述 在IS-IS网络中&#xff0c;所有的Level-2和Level-1-2路由器构成了一个连续的骨干区域。Level-1区域必须且只能与骨干区域相连&#xff0c;不同的Level-1区域之间不能直接相连。Level-1区域内的路由信息会通过Level-1-2路由器通报给Level-2区域&#x…

语音测试(二)音频标注

一、标注工具&#xff08;praat&#xff09; Praat的主要功能是对自然语言的语音信号进行采集、分析和标注&#xff0c;并执行包括变换和滤波等在内的多种处理任务。 二、标注教程 音频标注工具&#xff08;praat&#xff09; a.打开praat软件在Praat Objects界面上选择Open选…

【全志H616】【开源】 ARM-Linux 智能分拣项目:阿里云、网络编程、图像识别

【全志H616】【开源】 ARM-Linux 智能分拣项目&#xff1a;阿里云、网络编程、图像识 文章目录 【全志H616】【开源】 ARM-Linux 智能分拣项目&#xff1a;阿里云、网络编程、图像识1、实现功能2、软件及所需环境3、逻辑流程图及简述3.1 完整逻辑流程图3.2 硬件接线3.3 功能简述…

我的sql我做主!Mysql 的集群架构详解之组从复制、半同步模式、MGR、Mysql路由和MHA管理集群组

目录 Mysql 集群技术一、Mysql 在服务器中的部署方法1.1 在Linux下部署mysql1.1.1 安装依赖性&#xff1a;1.1.2 下载并解压源码包1.1.3 源码编译安装mysql1.1.4 部署mysql 二、Mysql的组从复制2.1 配置mastesr2.2 配置salve2.3 当有数据时添加slave22.4 延迟复制2.5 慢查询日志…

wlanapi.dll丢失怎么办?有没有什么靠谱的修复wlanapi.dll方法

在遇到各种系统文件错误当中&#xff0c;其中之一就是“wlanapi.dll文件丢失”的问题。这种问题通常发生在Windows操作系统上&#xff0c;特别是当系统试图执行与无线网络相关的任务时。wlanapi.dll是一个重要的系统文件&#xff0c;它负责处理Windows无线网络服务的许多功能。…

【ESP32 】VScode -window环境配置(adruino开发)(点亮LED)

创建工程 新建工程 、 进行vs code的下载&#xff0c;等待一段时间 工程代码 #include <Arduino.h>// put function declarations here: int myFunction(int, int);void setup() {// put your setup code here, to run once:int result myFunction(2, 3);pinMode(2…

一分钟创建自己的分班查询系统,家长扫码即可进群

开学后&#xff0c;老师们的忙碌也达到了顶峰。整理教材、准备课程计划、布置教室&#xff0c;这些工作已经让人应接不暇&#xff0c;更别提还要处理分班事宜。以往&#xff0c;老师们需要一个个通知家长分班结果&#xff0c;这不仅耗时耗力&#xff0c;还容易出错。家长们也常…

【Qt】tcp服务器、tcp多线程服务器、心跳保持、服务端组包

文章目录 背景&#xff1a;代码实现&#xff08;服务端&#xff09;&#xff1a;总结改进方案&#xff1a;多线程tcp服务器代码实现&#xff08;服务端&#xff09;心跳保持&#xff1a;大文件收发 背景&#xff1a; 局域网内&#xff0c;客户端会进行udp广播&#xff0c;服务…

书法图片自动扣字的批处理

本程序会根据原文字图片&#xff0c;自动扣字并生成黑字、红字2个透明的png图片&#xff0c;原图片黑字或白字均可。运行的话需要先安装好 ImageMagick-7.1.1-37 用法与生成效果举例&#xff1a; a.jpg 白字 转 黑、红扣字png: b.jpg 黑字 转 黑、红扣字png: 分享脚本如下: …

Spring MVC 八股文

目录 重点 SpringMVC的工作原理 Spring MVC 拦截器 Spring MVC 的拦截器和 Filter 过滤器有什么差别&#xff1f; 基础 什么是SpringMVC SpringMVC的优点 Spring MVC的核心组件 Spring MVC的常用注解由有哪些 Controller 注解有什么用 重点 SpringMVC的工作原理 1、客…

OLED显示屏详解(IIC协议0.96寸 STM32)

目录 一、介绍 二、模块原理 1.原理图 2.工作原理&#xff1a;SSD1306显存与命令 三、程序设计 main.c文件 oled.h文件 oled.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 OLED是有机发光二极管&#xff0c;又称为有机电激光显示&#xff08;Organic Electrol…