学习Vue 做一个简单的Todo List

原生JS实现todo-list小项目 原生JS实现todo-list小项目 该项目旨在练习和巩固JS的相应知识点,功能有但不仅限于基本DOM操作,事件触发,数据基本处理等。 功能及界面参考:https://nourabusoud.github.io/vue-todo-list/ 项目地址:https://github.com/Miever1/todo-list-js 基本效果如图: 具体功能实现 数据存储没有用到浏览器... 阅读详情

一、创建Vue项目

创建项目的方式有很多,这就简单的说两种吧:
1、命令行创建
win+r 输入cmd 回车 cd进入你要创建的目录
输入下面的命令,遇到需要确认的地方按回车就行了,一般没有什么问题

vue init webpack todolist // todolist是项目名称

创建成功以后
进入项目里面安装依赖运行

cd todolist
npm install // yarn 或  cnpm install
npm run dev

2、如果使用的HBuilder开发工具,可以直接在工具中创建项目
点击左上角的文件->新建->项目
输入名称,选好文件夹,点击创建就可以了
在这里插入图片描述
项目创建完成后
1、在src目录下新建pages文件夹,里面创建todolist.vue文件
2、配置路由:
1)安装 npm i router
2)在src目录下新建router文件夹,再创建一个index.js文件用来配置路由

import Vue from "vue"
import Router from "vue-router"
Vue.use(Router)

import Index from '@/pages/todoist'

const router = new Router({
	mode: 'history',
	routes: [
		{
			path: '/',
			name: 'index',
			component: Index
		},
	]
})

export default router

3)main.js文件中引入路由

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import VueRouter from 'vue-router'

Vue.config.productionTip = false
Vue.use(VueRouter)

new Vue({
	router,
	render: h => h(App)
}).$mount('#app')

最终
项目文件如下:
在这里插入图片描述

二、组件

todolist可以分为三个板块
1、头部(添加输入栏目)
2、列表(添加栏目列表)
3、底部(按钮等)
我们可以将这三个板块拆分成三个组件:

1、在todolist文件夹下新建components文件夹
2、在文件夹下新建三个组件:
todoHeader, todoItem, todoFooter
3、引入组件

import todoHeader from './components/todoHeader.vue'
import todoItem from './components/todoItem.vue'
import todoFooter from './components/todoFooter.vue'
export default {
	components: {
		todoHeader,
		todoItem,
		todoFooter
	},
	data() {
		return {}
	},
	methods: {}
}

三、组件代码

index.vue

<template>
	<div class="page flex">
		<div class="card">
			<h1>Todo List</h1>
			<todoHeader @confirm="confirm" />
			<todoItem :list="list" @change="changeList" />
			<todoFooter :list="list" @change="allChange" @delete="show_confirm" />
		</div>
	</div>
</template>

<script>
	import todoHeader from './components/todoHeader.vue'
	import todoItem from './components/todoItem.vue'
	import todoFooter from './components/todoFooter.vue'
	export default {
		components: {
			todoHeader,
			todoItem,
			todoFooter
		},
		data() {
			return {
				list: [
					// {
					// 	value: '吃饭',
					// 	checked: false
					// },
					// {
					// 	value: '睡觉',
					// 	checked: false
					// }
				]
			}
		},
		methods: {
			changeList({checked, index}) {
				this.list[index].checked = checked
			},
			confirm(value) {
				this.list.push({
					value,
					checked: false
				})
			},
			allChange(checked) {
				this.list.map(item => {
					item.checked = checked
				})
			},
			show_confirm() {
				if (this.list.length > 0) {
					let flag = false
					this.list.map(item => {
						if (item.checked) {
							flag = true
						}
					})
					if (flag) {
						let modal = confirm("确定要删除已经完成的任务吗?");
						if (modal) {
							this.del()
						}
					} else {
						alert('只能删除已经完成的任务!')
					}
				} else {
					alert('没有可删除的任务!')
				}
				
			},
			del() {
				let arr = []
				this.list.map((item, index) => {
					if (!item.checked) {
						arr.push(item)
					}
				})
				
				this.list = arr
			}
		}
	}
</script>

<style>
	.page{
		width: 100%;
		margin-top: 50px;
		justify-content: center;
	}
	
	.flex{
		display: flex;
		align-items: center;
	}
	
	.flex-1{
		flex: 1;
	}
	
	.card{
		width: 500px;
		padding: 15px 16px;
		border-radius: 4px;
		border: 1px solid #DCDFE6;
	}
	
	.card:hover{
		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1)
	}
	
	h1{
		text-align: center;
		margin-bottom: 20px;
	}
</style>

todoHeader.vue

<template>
	<div class="header flex">
		<div class="inputs flex-1" :class="isfocus ? 'focus' :''">
			<input placeholder="请输入你的任务名称,按回车键确定" class="input" type="text" v-model="value" @focus="focus" @blur="blur" @keyup.enter="confirm" />
		</div>
		<button v-show="isfocus" class="btn" type="button">Add</button>
	</div>
</template>

<script>
	export default {
		data() {
			return {
				isfocus: false,
				value: ''
			}
		},
		methods: {
			focus() {
				this.isfocus = true
			},
			blur() {
				this.isfocus = false
			},
			confirm() {
				this.$emit('confirm', this.value)
				this.value = ''
			}
		}
	}
</script>

<style>
	.header{
		width: 100%;
		margin-bottom: 20px;
		justify-content: space-between;
	}
	
	.inputs{
		border-radius: 4px;
		border: 1px solid #DCDFE6;
		padding: 6px 10px;
	}
	
	.inputs.focus{
		border: 1px solid #409EFF;
		box-shadow: 0 1px 8px 0 rgba(64, 158, 255, 0.4)
	}
	
	.input{
		width: 100%;
		height: 20px;
	}
	
	.btn{
		padding: 6px 10px;
		background-color: red;
		color: #FFFFFF;
		border-radius: 4px;
		cursor: pointer;
		margin-left: 20px;
	}
	
	.btn:hover{
		background-color: #F56C6C;
	}
</style>

todoItem.vue

<template>
	<div class="list">
		<ul v-if="list.length">
			<li class="flex" v-for="(item, index) in list" :key="index">
				<div class="flex-1" @click="change(!item.checked, index)">
					<input class="checkbox" type="checkbox" :value="item.value" v-model="item.checked" @change.stop="change(item.checked, index)" />
					<label class="label">{{ item.value }}</label>
				</div>
				<div v-if="item.checked" style="color: #C0C4CC;">已完成</div>
			</li>
		</ul>
		<div class="empty flex" v-else>
			<span>暂无任务</span>
		</div>
	</div>
</template>

<script>
	export default {
		props: {
			list: {
				type: Array,
				default: []
			}
		},
		data() {
			return {}
		},
		methods: {
			change(checked, index) {
				this.$emit('change', {checked, index})
			}
		}
	}
</script>

<style>
	.list{
		width: 100%;
		margin-bottom: 20px;
	}
	
	ul{
		width: 100%;
		border-radius: 4px;
		border: 1px solid #DCDFE6;
	}
	
	li{
		padding: 0 10px;
		border-bottom: 1px solid #DCDFE6;
		justify-content: space-between;
		cursor: pointer;
	}
	
	li > div{
		padding: 8px 0;
	}
	
	li > div >  .label{
		margin-left: 8px;
		font-size: 14px;
		line-height: 14px;
	}
	
	li:last-child{
		border-bottom: none;
	}
	
	li:hover{
		color: #409eff;
		background-color: #ecf5ff;
	}
	
	.empty{
		justify-content: center;
		width: 100%;
		height: 50px;
	}
	
	.empty span{
		color: #C0C4CC;
		font-size: 20px;
	}
</style>

todoFooter.vue

<template>
	<div class="footer flex">
		<div class="flex">
			<input class="checkbox" type="checkbox" value="all" v-model="checked" @change="change(checked)" />
			<label class="label">
				已完成 ({{ count }})
				/
				全部 ({{ total }})
			</label>
		</div>
		<div>
			<button class="btn" type="button" @click="del">Delete</button>
		</div>
	</div>
</template>

<script>
	export default {
		props: {
			list: {
				type: Array,
				default: []
			}
		},
		data() {
			return {
				checked: false
			}
		},
		computed: {
			total() {
				return this.list.length
			},
			count() {
				let count = 0
				this.list.map(item => {
					if (item.checked) {
						count += 1
					}
				})
				return count
			}
		},
		methods: {
			change(checked) {
				this.$emit('change', checked)
			},
			del() {
				this.$emit('delete')
			}
		}
	}
</script>

<style>
	.footer{
		width: 100%;
		justify-content: space-between;
	}
	
	.btn{
		padding: 6px 10px;
		background-color: red;
		color: #FFFFFF;
		border-radius: 4px;
		cursor: pointer;
	}
	
	.btn:hover{
		background-color: #F56C6C;
	}
	
	.label{
		margin-left: 15px;
		line-height: 14px;
		font-size: 14px;
	}
</style>

组件通信

1、父子组件之间往往是需要进行数据交互的,他们之间的数据传递的方法也有很多,这里使用的是props的方法

props: {
	list: {  // 传递的数据名称
		type: Array,  // 数据类型
		default: []  // 默认值
	}
}

2、在子组件中想要调用父组件的方法这里是采用的$emit

// 子组件中
change(checked, index) {
	this.$emit('change', {checked, index})  // 第一个参数是传递的方法名称, 第二个参数是需要项外传递的参数
}  

// 父组件中
// 通过子组件中定义的change来接收执行方法
<todoItem :list="list" @change="changeList" />

图片演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三部对接 sora-2:OpenAI 最新视频模型快速接入指南 本文介绍OpenAI最新视频生成模型Sora-2的接入方案,重点解析其Chat格式调用功能。开发者可通过在提示词中嵌入"横屏/竖屏""时长""清晰度"等要求快速生成视频。文章分三部分:1)基础准备(环境配置与API密钥获取);2)核心调用(提供Python/Java示例代码);3)结果查询与优化建议。Sora-2支持多语言调用,简化了视频生成流程,适用于短视频、广告创意等场景。 阅读详情

相关推荐

基于深度强化学习的无地图移动机器人导航:让机器人在未知环境中智能前行

虽然仍然面临sim-to-real差距、安全性保证等挑战,但随着算法的不断改进和计算能力的提升,基于DRL的无地图导航技术将在服务机器人、工业自动化、太空探索等领域发挥越来越重要的作用,为人类生产和生活带来更大便利和价值。对于复杂环境下的动态目标导航问题,研究人员提出了多智能体协同控制算法(如Teamwork-Net算法),通过多个智能体分别控制机器人的运动速度与运动方向,协同实现更高效、更稳定的导航性能。深度强化学习结合了深度学习的感知能力和强化学习的决策能力,非常适合解决无地图导航问题。

weixin_45131592的博客 903

Vue 组件封装之 List 列表

实现 List 列表布局排版。

杏子 2万+

构造地貌研究入门:手把手教你用ArcGIS插件CalHypso分析流域地貌形态

本文详细介绍了如何使用ArcGIS插件CalHypso进行流域地貌形态分析,包括工具安装、数据预处理、HI曲线生成及结果解读等关键步骤。通过实战操作,帮助读者掌握面积高程积分(HI)曲线的应用技巧,为构造地貌研究提供量化工具。

weixin_33704234的博客 105

vue 基础(一)

VUE 一. 开发工具 VUE开发环境个人推荐使用VS code, 然后安装特定的插件即可开发,可用插件如下: Vetur —— 语法高亮、智能感知、Emmet等 EsLint—— 语法纠错 Auto Close Tag —— 自动闭合HTML/XML标签 Auto Rename Tag —— 自动完成另一侧标签的同步修改 Path Intelli...

youhaiguo的博客 420

搜索引擎——ElasticSearch汇总

汇总——ElasticSearch篇 全文检索 问题1:什么是全文检索? 基本概念:对**非结构化数据/结构化数据**先建立**索引**,再对索引进行搜索**文档**的过程叫做全文检索。 什么是非结构化与结构化数据? - 非结构化数据:没有固定的格式的数据(html,word,excel)---没有固定长度,字段约束,描述,散列数据 - 结构化数据:有固定的格式的数据(如:数据库数据)---有固定长度(varchar(50)),字段类型,描述修饰数据 搜索算法:顺序扫描法、倒排索引法 - 顺序

alonewolf_99的博客 1839

实战教程:用YOLOv11+PyQt5打造工地安全帽检测系统(附完整数据集)

本文提供了一份完整的实战指南,详细介绍了如何利用YOLOv11目标检测模型与PyQt5界面库,从零开始构建一个智能工地安全帽检测桌面应用。内容涵盖高质量数据集的准备与标注、YOLOv11模型训练与调优,以及如何使用PyQt5开发流畅、专业的图形用户界面,最终实现一个可实际部署的AI安全监控系统。

plum99的博客 738

Vue系统学习(一) vue-cli3 创建项目并简单实现list增加删除功能

其实很早就把这几个demo代码写完了(可参照github提交时间),现在想着把对应操作的博客给补起来, 代码全部托管在 github : https://github.com/wgPython/vue_study_demo 首先看实现效果 ...

王小右的博客 1697

MOOS-ivp 实验三 MOOS简介(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

weixin_44151170的博客 7434

Vue TodoList案例(组件化编程的流程)

一、拆分组件(功能点)并实现静态组件 这边定义组件,并且只考虑组件的结构和样式,不考虑数据交互点击等,不包括动态的数据也不包括动态的交互 二、进行动态动态展示数据 一、这边考虑数据的时候 应该设置为[]里面为{}的形式 二、数据写在哪里,哪边要进行展示就把数据放在哪边 这边要在list里面展示出来,就写在list组件上 使用v-for和props传入数据实现数据的动态 ...

MCCLS的博客 471

PointPainting 复现

三维目标检测

weixin_58207716的博客 4536

华为OD机考双机位C卷 - 简单的解压缩算法 (Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 简单的解压缩算法 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 130

Vue学习:简单的ToDoList开发

Vue学习:简单的ToDoList开发   一、知识点 1.1 v-for v-for=“item in list”,这里告诉vue需要去循环list里面的数据,循环的每一项我都放进item里面,然后利用插值表达式{{}}去使用item, <html lang="en"> <head> <meta charset="UTF-8"> ...

Derrick 245

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 244

我的第一个Vue3组件,实现TODO-LIST

我是傲夫靠斯,欢迎关注我的公众号【前端工程师的自我修养】,搜索f2ef2e,每天更新。 Vue3已经发布很久了,而且我已经使用Vue很多年了,对Vue框架也是尤为喜爱。今天我将通过一个最简单的组件来展示Vue3的魅力以及它和Vue2的不同之处。我们将会用到Vite、composition API、ref、computed、setup()等Vue3的新特性使用方法。 创建项目 创建项目我不使用Vue-CLI去创建,使用Vue的全新生态共建Vite来创建,Vite是一个非常棒的Web开发打包工具,它可以让我.

小帅的编程笔记 730

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Vue2学习day05—Todo-list案例

文章目录Vue2学习day05—— Vue2学习day05—— Todo-list案例

Happy_change的博客 2889

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Vue.js实现一个todo-list的上移,下移,删除功能

如图,A simple todo-list长这样

ljw_Josie的博客 3086

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Vue框架Todo-list案例

记录Vue学习的过程——今天是Todo-list案例

qq_55461941的博客 1164

用 vue 快速做一个简单点的 TODO-LIST

思路整理 主要涉及知识点: vue 如何创建并运行项目 vue create xxx; 如何定义data() { return {} }及渲染数据 {{stu}}; 如何定义移除/增添函数; 添加form表单; 提交数据; filter() 方法的使用来遍历并过滤数组; 如何阻止函数的默认行为: e.preventDefault() ; 如何拷贝对象 const stu = Object.asign({}, this.stu) ; push() 方法的使用, 为数组添加元素 清空表单 代码块 &lt

赵博林 674

用VUE做一个简单的ToDo list (代码可直接运行)

用VUE做一个简单的ToDo list (代码可直接运行) 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- <script src="./js/vue.js"></script> --&

ffffffffhh的博客 478

vue todo list_一个简单的Todo list Vue应用程序

vue todo list 待办事项清单 (Todo list) Todo list is a simple Vue application. 待办事项列表是一个简单的Vue应用程序。 View Demo 查看演示 Download Source 下载源 如何使用 (How to use) The way this Todo List app works is pretty simple....

cuk5239的博客 325

list取第一个 vue_Vue快速上手的第一个项目—— todo-list

前言在上大学那阵子,jQuery正流行,于是凭借着“一边百度一边敲代码的本领”,怎能把自己想要的效果显示出来,但是jQuery背后疯狂操纵dom的事实,和日后难维护的问题,当时并没有顾及太多(但是当时我就发现了,想要变换个什么功能,在代码里面找起来,是真的费劲)。等开始实习的时候,实习单位使用的是Angular(刚入职的时候使用的AngularJs 后来使用了Angular4 这两个的关系就像是猫...

weixin_39546661的博客 350

用Vue搭建一个应用盒子(一):todo-list

这是我用Vue搭建的应用盒子的第一个功能:todo-list

jobs_anfield的博客 1219

三、VUE学习笔记 3 | Vue CLI--Todo List、Vuex、路由

目录 一、VUE CLI---DEMO 全局安装 vue-cli 安装依赖 删除功能 二、Vuex(基于Vue cli) 1、定义 2、使用 3、案例-state和mutations 4、getters属性 三、路由 1、基本使用 2、router-link 3、重定向 4、设置路由高亮 5、为路由切换启动动画 6、路由传参 (1)使用query (2)...

Shawn的博客 731

Vue-Todo-list 案例

Vue-Todo-list 案例

m0_61787196的博客 1010

纯前端Vue实现Todo_list备忘录及导航案例

Vue实现打卡导航

AI~天海的博客 1303

使用Vue.js完成一个todo-list

使用Vue.js完成一个todo-list首先分析一下页面的组成,要与一个供输入的用户输入框,然后下面应该是个列表,这个列表是用户的输入的内容的展示页面结构: <div id="todo-list-emp"> <input type="text" placeholder="Add a todo" v-model="newTodoText" v-on:keyup.enter="add

Dear_Mr的博客 2982
上一篇: jquery鼠标移动、点击页面出现爱心
下一篇: Layui
DevilAngelia
博客等级 码龄8年 5粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevilAngelia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值