当前位置: 首页 > news >正文

用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

 

目录

 

一.准备工作

二.编写各个组件的页面结构

三.实现初始任务列表的渲染

四.新增任务

五.删除任务

六.展示未完成条数

七.切换状态-筛选数据

八.待办事项(全)代码


 

一.准备工作

在开发“ToDoList”案例之前,需要先完成一些准备工作,包括创建项目、引入 BootStrap 样式文件和搭建基本项目结构,下面分别进行实现。

(1)创建项目 创建项目包含新建项目、安装依赖项和运行项目,具体步骤如下。

① 创建项目。使用HbuliderX软件创建todolist项目 在src的目录下创建style.css 文件中的样式,具体代码如下。

style.css样式如下:

:root {font-size: 16px;}body {margin: 0;}

② 新建并封装组件。在D:\vue\chapter03\todolist\src\components 目录下新建文件 ToDoHeader.vue、ToDoMain.vue 和 ToDoFooter.vue,分别表示 ToDoHeader、ToDoMain 和ToDoFooter 组件。

8e63932db2404753a837df16d181551d.png

③ 各个组件中的<style>节点的样式代码。

二.编写各个组件的页面结构

 

准备工作完成之后,接下来编写各个组件的页面结构,实现“ToDoList”案例静态页 面的渲染,具体步骤如下。

①在App组件中以局部注册的方式引入ToDoHeader、ToDoMain、ToDoFooter组 件

c3c81311e10c46ed8d4af3506e13323d.png

 ②在ToDoHeader组件中编写输入区域的页面结构

fa84afc733e6431191418e97f8e7b921.png

③ 在ToDoMain组件中编写列表区域的页面结构

d454f098d65d42879f1d913ac89dfaec.png

④ 在ToDoFooter组件中编写切换状态区域的页面结构

b4b2759ee9d34cfa9d07b7793531242c.png

三.实现初始任务列表的渲染

App 组件为根组件,数据在App组件中,现在需要将App根组件中的初始数据传递 到列表区域,ToDoMain组件中。即通过props(自定义属性)从父组件(App组件)向 子组件(ToDoMain组件)中传递数据。实现初始任务列表具体步骤如下。

① 在ToDoMain组件中定义可以从父组件中接收的数据

a31c454f08a842e1b18202f2846a1372.png

② 在App组件中定义页面的初始数据

125df32731374900b29c74a6803b1f8c.png

③ 通过自定义属性进行传递数据

47d152b81ad44c828177e4a41b85b208.png

④ 修改ToDoMain组件中的代码,将接收到的list数据进行展示。

c19b82dddc644fd28dfb1f4b3b5f775a.png

四.新增任务

“ToDoList”案例中在文本框中输入内容,按下回车后添加任务到任务列表,将用户 输入的任务名称通过自定义事件从ToDoHeader组件传递到App组件,具体步骤如下代码省略。、

① 修改ToDoHeader组件中的代码,添加页面的初始数据

6d477c062f894cdbbfb74230af780d7f.png

② 获取input输入框的值,修改ToDoHeader组件中的代码

e2f978b70c79453da8e14bc6880a4835.png

③ 修改ToDoHeader组件中的代码,为input输入框绑定回车事件,事件处理函数 名称为enterName

ad84ce526bed4199a8dcb8f571cc04c7.png

④ 修改ToDoHeader组件中的代码,通过调用defineEmits()方法来声明自定义事 件

c51b6c2960c146818afafc7959fb5a75.png

⑤ 在ToDoHeader组件中添加enterName()方法,通过调用emit()方法触发自定义事 件

db2bdeb5191f415a84bfdba34e1c07f9.png

⑥ 在App组件中监听addTodo自定义事件,当enterName事件触发时,调用 addToDo()方法

a9daf96d031d41678b31b2bd14c00741.png

⑦ 添加addToDo方法,实现数据的处理

ace429f781b54af6bfbf7bcd8b9ec848.png

 

五.删除任务

当鼠标指针滑到任务列表中每一项时,在右侧会出现“×”图标,单击该图标即可 进行删除当条任务操作。首先在ToDoMain组件中声明并触发自定义事件,传递参数 6 id,接着在App组件中监听自定义事件,当自定义事件被触发时,执行对应的方法,进 行删除操作,删除任务的具体实现步骤如下。

① 在ToDoMain组件中,声明自定义事件delTodo,用于表示删除任务

5d51e85dcec5496a8a303f7a5bc1487b.png

② 在ToDoMain组件中定义delToDo()方法,触发自定义事件

716fdb98ccb34973b645bb753a6a2951.png

③ 修改删除按钮的代码,添加点击事件,传入需要删除的id

c76f6242dd4149dca4fc6d338dc9960d.png

④ 在App组件中监听

8f6d8267e865479199613869cb1903a9.png

⑤ 在App组件中添加delToDo方法,进行列表中对应任务的删除操作

fa36dffbcd6c49bdaf6039b2037e4f6f.png

六.展示未完成条数

在任务状态区域的左侧会显示未完成任务的条数,接下来计算未完成任务的条数并 将其在页面中渲染出来,具体步骤如下代码省略。

① 在App组件中定义计算属性,计算未完成的任务条数

2f144a08ee2c4ef28d79cf9d9ae16d80.png

 ② 将自定义属性传给ToDoFooter组件

d383da5dd7ca4859afd92edf7556bdd7.png

③ 在ToDoFooter组件中接收lastLength

59df8f2739cb4906b48915600a70e5ba.png

④ 在ToDoFooter组件中将条数展示出来

34c37fc1d76241449ee53761ec7aa81b.png

七.切换状态-筛选数据

单击切换状态区域时,默认状态为all,即显示全部任务,当状态切换为active时, 显示未完成的任务,当状态切换为completed时,显示已完成的任务,实现切换数据筛选 状态具体步骤如下代码省略。

① 首先在App组件中定义页面的使用一个任务状态状态属性status

8f854ba8fe7347eeb9aaaea69fda5b23.png

② 在App组件中通过不同的status展示不同的任务,实现任务数据的切换

d95eae8d69894ceb99decc19e70aea6e.png

③ 修改App组件,将showList传递给ToDoMain组件

f1b9a881a1b64f40b627ee1607e4849b.png

④ 设置自定义事件名称

c8834c8f03bc48629a187fe342700e35.png

⑤ 在ToDoFooter组件中定义props属性,表示从父组件中接收该数据

412a9b294236430aa57ba154e445b965.png

⑥ 在App组件中定义props,即从App组件中传递status到ToDoFooter组件中

cf37bcebc9604fdc98f334389fef354c.png

⑦ 在ToDoFooter组件中单击链接按钮时更改状态

6305a1604ccb407ba09d326aad030eb6.png

⑧ 在App组件中监听updateStatus自定义事件,通过自定义事件将status属性的值 从ToDoFooter组件传递到App组件中,具体代码如下

135af15de1264610997e645b41e0cd59.png

⑨ 定义updateStatus()方法,用来更新状态,具体代码如下。

b3e781afc384481e97d09d50c72f1102.png 

八.待办事项(全)代码

d1d6f8abbd6c4e7b8face81024650a43.png

ToDoFooter.vue代码:

<template><div class="footer"><span class="todo-count">共<strong>{{ lastLength }}</strong>条未完成任务</span><ul class="filters"><li><a @click.prevent="emit('updateStatus', 'completed')" :class="{ selected: status === 'completed' }"href="#/completed" style="background-color: lightblue;">Completed</a></li><li><a @click.prevent="emit('updateStatus', 'active')" :class="{ selected: status === 'active' }"href="#/active" style="background-color: lightblue;">Active</a></li><li><a @click.prevent="emit('updateStatus', 'all')" :class="{ selected: status === 'all' }" href="#/" style="background-color: lightblue;">All</a></li></ul></div>
</template><script setup>const props = defineProps(['lastLength','status'])</script><style>.filters{display:flex;flex-direction:row-reverse;/* 相反方向 */}ul{list-style: none;}ul li{padding-left:10px ;}a{text-decoration: none;border: 1px solid black;color: black;}
</style>

ToDoHeader.vue代码: 

<template><div><div class="header"><p class="title">待办事项</p><input class="new-todo" type="text" placeholder="请填写任务" v-model.trim="name"  @keyup.enter="enterName" /></div></div></template><script setup>import { ref } from 'vue'const name = ref('')const enterName = () => {emit('addTodo', name.value)name.value = ''}const emit = defineEmits(['addTodo'])</script><style>.title{border-bottom:1px solid grey;text-align:center;font-size:36px;color:brown;}.header{border:1px solid grey;}.new-todo{position: relative;top:-20px;left: 50px;border: none;font-size: 20px;}</style>

 ToDoMain.vue代码:

<template><div class="main"><ul class="todo-list"><li v-for="item in list" :key="item.id" :class="{ completed: item.done }"><div class="view"><input class="toggle" type="radio" v-model="item.done" /><label class="zi">{{ item.name }}</label><button class="destroy" @click="delTodo(item.id)"></button></div></li></ul></div></template><script setup>const props = defineProps({list: {type: Array,required: true},})const emit = defineEmits(['delTodo'])const delTodo = id => {id && emit('delToDo', id) // 触发事件}
</script><style>
.toggle{width: 30px;height: 30px;}
.view{margin-left: -40px;	
}
.zi{font-size: 18px;padding-left: 20px;}
.destroy{border: none;margin-left: 10px;
}
</style>

App.vue代码:


<script setup>
// This starter template is using Vue 3 <script setup> SFCs
// Check out https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup
import ToDoHeader from './components/ToDoHeader.vue'
import ToDoMain from './components/ToDoMain.vue'
import ToDoFooter from './components/ToDoFooter.vue'
import { ref, computed, defineEmits } from 'vue'const emits = defineEmits(['updateStatus']) // 添加 defineEmits 声明const status = ref('all')
const list = ref([{ id: 1, name: '晨练', done: false },{ id: 2, name: '练书法', done: true },{id:3,name:'完成Vue.js组件部分习题',done:false},
])const addTodo = (name) => {list.value.push({ name, done: false, id: ~~(Math.random() * 1000) })
}const delToDo = id => {list.value = list.value.filter((item) => item.id !== id)
}const lastLength = computed(() => {return list.value.filter((item) => !item.done).length
})const showList = computed(() => {if (status.value === 'all') {return list.value}if (status.value === 'active') {return list.value.filter((item) => !item.done)}if (status.value === 'completed') {return list.value.filter((item) => item.done)}
})const updateStatus = (newStatus) => {status.value = newStatus;
}
</script><template><ToDoHeader @addTodo="addTodo"></ToDoHeader><!-- <ToDoMain :list="showList" @delToDo="delToDo"></ToDoMain> --><ToDoMain :list="list" @delToDo="delToDo"></ToDoMain><ToDoFooter :lastLength="lastLength" :status="status" @updateStatus="updateStatus"></ToDoFooter>
</template><style></style>

 

main.js代码:

import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

 最终效果图如下:

2582c94fd96e48b69449147ae380950a.png

 功能展示:

0b150a6ed583433d96aac86e66d0173a.png今天就分享到此,感谢预览~ 

 

 

相关文章:

用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

目录 一.准备工作 二.编写各个组件的页面结构 三.实现初始任务列表的渲染 四.新增任务 五.删除任务 六.展示未完成条数 七.切换状态-筛选数据 八.待办事项&#xff08;全&#xff09;代码 一.准备工作 在开发“ToDoList”案例之前&#xff0c;需要先完成一些准备工作&a…...

提高大型语言模型 (LLM) 性能的四种数据清理技术

原文地址&#xff1a;four-data-cleaning-techniques-to-improve-large-language-model-llm-performance 2024 年 4 月 2 日 检索增强生成&#xff08;RAG&#xff09;过程因其增强对大语言模型&#xff08;LLM&#xff09;的理解、为它们提供上下文并帮助防止幻觉的潜力而受…...

Rust 练手小项目:猜数游戏

好久没写 Rust 了&#xff0c;参考《Rust 程序设计语言》写了一下猜数游戏。差不多 40 行&#xff0c;感觉写起来真舒服。 use rand::Rng; use std::{cmp::Ordering, io};fn main() {let secret_number rand::thread_rng().gen_range(0..100);println!("[*] Guess the n…...

蓝桥杯物联网竞赛_STM32L071_16_EEPROM

仍然是没有考过的知识点 朴素的讲就是板子中一块不会因为断电重启而导致数值初始化的一片地址 要注意的是有时候容易把板子什么写错导致板子什么地址写坏了导致程序无法烧录&#xff0c;这个时候记得一直按flash键烧录&#xff0c;烧录时会报错&#xff0c;点击确定&#xff0…...

复习知识点整理

零碎语法 1.导入某个文件夹的index文件&#xff0c;index可以省略&#xff08;这里导入的是router和store文件下的index.js文件&#xff09; 2.路由懒加载 this 1.在vue文件中使用router\store对象时 this&#xff1a;普通函数的this指向vue实例对象(在没有明确指向的时候…...

7款公司电脑监控软件

7款公司电脑监控软件 研究证明&#xff0c;人们在家办公的效率比在办公室办公的效率低一半&#xff0c;其中原因是缺少监督&#xff0c;即便在公司办公&#xff0c;还存在员工偷闲的时刻&#xff0c;比如聊天、浏览无关网站、看剧、炒股等&#xff0c;企业想提高员工的工作效率…...

服务器 安装1Panel服务器运维管理面板

服务器 安装1Panel服务器运维管理面板 SSH链接服务器安装1Panel 出现此提示时输入目标路径&#xff0c;须以“/”开头&#xff0c;默认&#xff1a;/opt&#xff0c;本例&#xff1a;/www。 出现此提示时输入目标端口&#xff0c;须未被使用的端口&#xff0c;默认&#xff1…...

最大花之能量(蓝桥杯)

文章目录 最大花之能量问题描述动态规划 最大花之能量 问题描述 在一个神奇的王国里&#xff0c;有一个美丽的花园&#xff0c;里面生长着各种奇妙的花朵。这些花朵都有一个特殊的能力&#xff0c;它们能够释放出一种叫做「花之能量」的神秘力量。每朵花的花之能量都不同&…...

探索算力(云计算、人工智能、边缘计算等):数字时代的引擎

引言 在数字时代&#xff0c;算力是一种至关重要的资源&#xff0c;它是推动科技创新、驱动经济发展的关键引擎之一。简而言之&#xff0c;算力即计算能力&#xff0c;是计算机系统在单位时间内完成的计算任务数量或计算复杂度的度量。随着科技的不断发展和应用范围的不断扩大…...

数据可视化-ECharts Html项目实战(10)

在之前的文章中&#xff0c;我们学习了如何在ECharts中编写雷达图&#xff0c;实现特殊效果的插入运用&#xff0c;函数的插入&#xff0c;以及多图表雷达图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&…...

甲方安全建设之研发安全-SCA

前言 大多数企业或多或少的会去采购第三方软件&#xff0c;或者研发同学在开发代码时&#xff0c;可能会去使用一些好用的软件包或者依赖包&#xff0c;但是如果这些包中存在恶意代码&#xff0c;又或者在安装包时不小心打错了字母安装了错误的软件包&#xff0c;则可能出现供…...

[html]网页结构以及常见标签用法

哎&#xff0c;我服了&#xff0c;明明之前学了html的&#xff0c;但时间一长我就忘记了&#xff0c;本来flask学到视图了&#xff0c;但涉及到了html我觉得还是需要重新回顾一下,,,,,, web开发技术栈一共有3门语言。分别是&#xff1a; HTML&#xff1a;译作超文本标记语言&am…...

【C语言】if语句选择题

前言 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 前言 关于if语句相关的选择题 题目一&#xff1a; 关于if语句说法正确是&#xff1a;( ) A .if语…...

ZLMediaKit ubantu 下编译

1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init二、依赖库 Debian系(包括ubuntu&#xff09;系统下安装依赖的方法&#xff1a; #除了…...

什么是stable diffusion

机器学习中的稳定扩散 在机器学习中&#xff0c;特别是在深度学习中&#xff0c;稳定扩散可能指的是通过特定的算法&#xff0c;例如深度学习模型&#xff0c;来稳定地生成数据或样本的过程。例如&#xff0c;一些生成模型能够稳定地从高斯分布中采样&#xff0c;以生成高质量的…...

C++ list链表模拟实现

目录 前言&#xff1a; 模拟实现&#xff1a; 迭代器的实现&#xff1a; list类功能函数实现&#xff1a; 初始化成空函数&#xff08;empty_init&#xff09;&#xff1a; 构造函数&#xff1a; 拷贝构造函数&#xff1a; 尾插&#xff08;push_back&#xff09;: 插入…...

LangChain - PromptTemplate

文章目录 关于 Prompt关于 PromptTemplate基本创建无变量输入1个变量多变量使用 from_template 自动推断 input_variables 聊天模板使用 from_template 方法构建使用 PromptTemplate 构建 MessagePromptTemplate使用一或多个 MessagePromptTemplates 构建一个 ChatPromptTempla…...

spring cloud gateway openfeign 联合使用产生死锁问题

spring cloud gateway openfeign 联合使用产生死锁问题&#xff0c;应用启动的时候阻塞卡住。 spring.cloud 版本如下 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><vers…...

【WPF应用37】WPF基本控件-DatePicker的详解与示例

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软推出的一个用于构建桌面应用程序的图形子系统。在WPF中&#xff0c;DatePicker控件是一个常用的控件&#xff0c;用于用户选择日期。DatePicker控件提供了一个简洁直观的界面&#xff0c;使用户能够轻松选择日…...

GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

&#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程) &#x1f4c1; 文章目录 &#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...