我的Vue组件化开发首个项目todolist

news2024/11/24 14:03:39

TodoList

学习笔记:
总结TodoList案例

1.组件化编码流程:

(1).拆分静态组件:组件要按照功能点拆分,命名不要与htm|元素冲突。

(2).实现动态组件:考虑好数据的存放位置,数据是一个组件在用, 还是一些组件在用: .

1).-个组件在用:放在组件自身即可。

2). -些组件在用:放在他们共同的父组件上(状态提升)。(3).实现交互:从绑定事件开始。

  1. props适用于:

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

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

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

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

运行截图:在这里插入图片描述
全选和取消全选,相应的全选或取消全选后全选按钮作出相应的反应:
在这里插入图片描述
在这里插入图片描述
增加
在这里插入图片描述
删除
在这里插入图片描述
清除已经完成的,全部清除后底部消失:
在这里插入图片描述
在这里插入图片描述
组件结构:
在这里插入图片描述

本项目是在vue-cil5,vue2,nanoid环境下运行

源码:

main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

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

app.vue

<template>
 <div id="app">
   <div class="todo-container">
   	<div class="todo-wrap">
   		<myHeader :addTodo="addTodo"/>
   		<myList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"/>
   		<myFoot :datas="todos" :checkAll="checkAll" :clearAlldone="clearAlldone"/>
   	</div>
   </div>
 </div>
</template>

<script>
import myHeader from "./components/myHeader.vue"
import myList   from "./components/myList.vue"
import myFoot   from "./components/myFoot.vue"
export default {
 name: 'App',
 data(){
 	return{
 		todos:
   	[{id:"001",title:"睡觉",done:true},
 		{id:"002",title:"开车",done:false},
 		{id:"003",title:"吹牛",done:true}]
 	}
 },
 methods:{
   addTodo(todoObj){
   	const obj=todoObj;
   	this.todos.unshift(obj);
   },
   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
   	})
   },
   checkAll(done){
   	this.todos.forEach((to)=>{
   		to.done=done
   	})
   },
   clearAlldone(){
   	this.todos=this.todos.filter((a)=>{
   		return !a.done
   	})
   }
 },
 components: {
  myHeader,
  myList,
  myFoot
 }
 
}
</script>

<style>
#app {
 font-family: Avenir, Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 color: #2c3e50;
 margin-top: 60px;
}

body{
    background: #fff;
}
.btn{
    display: inline-block;
    margin-bottom: 0;
    padding: 4px 12px;
    font-size: 14px;
    line-height: 20px;
    text-align: center;
    vertical-align: middle;
    cursor: pointer;
    box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0,0,0,0.3);
}
.btn-danger{
    color: #fff;
    background-color:#da4f49;
    border:1px solid #ba362f;
   
}
.btn-danger:hover{
    color: #fff;
    background-color: #bd362f;
}
.btn:focus{
    outline:none;
}
.todo-container{
    width: 600px;
    margin: 0 auto;
}
.todo-container .todo-wrap{
    padding: 10px;
    border:1px solid #ddd;
    border-radius: 5px;
}

</style>

myHeader.vue

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

<script>
	import {nanoid} from "nanoid"
	export default{
		name:"myHead",
		props:["addTodo"],
		data(){
			return{
				title:""
			}
		},
		methods:{
			add(){
				if(this.title.trim()!=""){
					const todoobj={id:nanoid(),title:this.title,done:false}
					this.addTodo(todoobj)					
					this.title=""
				}		
				else{
					alert("不能为空啊")
				}
			}
		},
		
	}
</script>

<style scoped>
	.todo-header input{
		width: 560px;
		height: 28px;
		font-size: 14px;
		border:1px solid #ccc;
		border-radius: 4px;
		padding: 4px 7px;
	}
	.todo-header input:focus{
		outline: none;
		border-color: rgba(80,160,231,0.7);
		box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(80,160,231,0.7);
	}
</style>

myList

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

<script>
	import myItem from "./myItem.vue"
	export default {
		name:"myList",
		components:{
			myItem,
		},
		props:["todos","checkTodo","deleteTodo"]
	}
</script>

<style>
   .todo-main{
	   border:1px #bbb solid;
	   
   }
</style>

myFoot

<template>
	<div class="todo-footer" v-if="total">
		<label ><input type="checkbox" v-model="istotal"/>
		</label>
		<span>
			<span>已完成{{donetotal}}</span>/全部{{total}}
		</span>
		<button class="btn btn-dabger" @click="cleardone">清除已完成任务</button>
	</div>
</template>

<script>
	export default {
		name:"myFoot",
		props:["datas","checkAll","clearAlldone"],
		computed:{
			total(){
				return this.datas.length
			},
			donetotal(){
				let total=this.datas.filter((t)=>{
					return t.done
				}).length
				return total
			},
			istotal:{
				get(){
					return this.total==this.donetotal&&this.total>0 ? true:false;
				},
				set(value){
					this.checkAll(value)
				}
			}
		},
		methods:{
			cleardone(){
				this.clearAlldone()
			}
		}
		
	}
</script>

<style scoped>
	.todo-footer{
		position: relative;
	}
	.todo-footer .btn{
		position: absolute;
		right: 10px;
		top: -5px;
		border-radius: 3px;
		background-color: #e7064d;
		border: 1px #d8235a solid;
		color: white;		
	}
	.todo-footer .btn:hover{
		transform: scale(1.01);
	}
	.todo-footer span{
		margin-left: 10px;
	}
	
</style>

myItem

<template>
	<div class="todo-footer" v-if="total">
		<label ><input type="checkbox" v-model="istotal"/>
		</label>
		<span>
			<span>已完成{{donetotal}}</span>/全部{{total}}
		</span>
		<button class="btn btn-dabger" @click="cleardone">清除已完成任务</button>
	</div>
</template>

<script>
	export default {
		name:"myFoot",
		props:["datas","checkAll","clearAlldone"],
		computed:{
			total(){
				return this.datas.length
			},
			donetotal(){
				let total=this.datas.filter((t)=>{
					return t.done
				}).length
				return total
			},
			istotal:{
				get(){
					return this.total==this.donetotal&&this.total>0 ? true:false;
				},
				set(value){
					this.checkAll(value)
				}
			}
		},
		methods:{
			cleardone(){
				this.clearAlldone()
			}
		}
		
	}
</script>

<style scoped>
	.todo-footer{
		position: relative;
	}
	.todo-footer .btn{
		position: absolute;
		right: 10px;
		top: -5px;
		border-radius: 3px;
		background-color: #e7064d;
		border: 1px #d8235a solid;
		color: white;		
	}
	.todo-footer .btn:hover{
		transform: scale(1.01);
	}
	.todo-footer span{
		margin-left: 10px;
	}
	
</style>

这给小项目作为vue新手练手组件化开发还是很不错的,这个项目b站上面有尚硅谷的课可以免费看(我只是一名普通的网友啊)
https://www.bilibili.com/video/BV1Zy4y1K7SH?p=70

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue简单实例——从webpack到vue,再到weex

这一章节&#xff0c;我们主要针对从webpack&#xff0c;vue&#xff0c;weex的框架结构上来说明对比这三个框架的区别 主要功能&#xff1a; webpack&#xff1a; webpack是前端项目工程化的具体解决方案。 它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆&…

基于身份的分段:三种技术路线解析与建议

SmartX 趋势分享 SmartX 趋势分享由 SmartX 团队内部分享的权威机构市场报告、全球重要媒体文章精选整理而成。内容涉及现代数据中心相关产业趋势以及金融、医疗、制造等行业全球用户需求与实践前沿洞察。在“零信任实践”系列的第一篇文章中&#xff0c;我们介绍了两种实现零信…

基于springboot“漫画之家”系统设计与实现-计算机毕业设计源码+LW文档

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

vue3+ts部分场景示例

模板语法 插值变量 div{{插值}}div const message: number 84; 指定变量为数字类型 const message: string小明 ; 指定字符串类型 const message: booleanfalse ; 指定布尔值类型 const message: any小明 ; any指定任意类型 const message: object{} ; 指定对象…

代码随想录算法训练营第七天|二叉树(截止到层序遍历)

二叉树的递归遍历 递归遍历是最简单的 // 前序 class Solution { public:void traversal(TreeNode* cur, vector<int>& vec) {if (cur NULL) return;vec.push_back(cur->val); // 中traversal(cur->left, vec); // 左traversal(cur->right, vec); //…

【高级篇】线程与线程池

一、线程回顾 1、初始化线程的 4 种方式 1&#xff09;、继承 Thread public static class Thread01 extends Thread{Overridepublic void run() {System.out.println("当前线程&#xff1a;"Thread.currentThread().getId());int i 10 / 2;System.out.println(&qu…

web前端期末大作业——HTML+CSS简单的旅游网页设计与实现

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

项目上云实战:如何把Java项目搬上云服务器?

1.中小型企业项目开发完成后应如何运行&#xff1f; 最近在后台私信中&#xff0c;很多小伙伴问询博主&#xff0c;中小企业项目开发完成后&#xff0c;是否在pc机上直接运行。答案是否定的&#xff0c;专业的软件开发企业都会选择linux服务器作为运行环境&#xff0c;企业服务…

[附源码]java毕业设计学生档案管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于java+springboot+mybatis+vue+elementui的毕业生信息招聘平台

项目介绍 随着我国教育改革的重大发展&#xff0c;越来越多的人都有了机会接受高等教育&#xff0c;同时每个大学生在毕业的时候都面临着一个重要的问题&#xff0c;那就是如何进行就业和找工作的问题&#xff0c;为了能够帮助更多的大学生找到适合自己的工作&#xff0c;我们…

m基于matlab的DQPSK调制解调技术的仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 4进制的DPSK通常记为DQPSK。DQPSK信号编码方式如下表&#xff1a; 表中 θk是相对于前一相邻码元的相位变化。共有A、B两种方式。B方式中相邻码元间总有相位改变&#xff0c;故有利于在…

卡尔曼滤波器

卡尔曼滤波器 参考资料&#xff1a;https://www.bilibili.com/video/BV12P411V7pc/?spm_id_from333.337.search-card.all.click&vd_source2f16c81b2e6b252c304116c646e6512c 卡尔曼滤波器是线性滤波器 在这里插入图片描述 状态预测公式&#xff1a; x^t−Ftx^t−1Btut\h…

个人信息保护法vs国家标准,37项标准为个人信息加道“安全锁”~(附整理文档及pdf下载)

如何防止个人敏感信息“过度采集”&#xff1f; 如何禁止“大数据杀熟”&#xff1f; 如何避免“个性化服务”泄露隐私&#xff1f; 2021年11月1日&#xff0c;《中华人民共和国个人信息保护法》生效施行&#xff0c;为我们在网上冲浪时守护个人隐私安全。《个人信息保护法》…

HTML静态网页作业html+css+javascript+jquery水果商城7页

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

怎么把Epub转换成PDF格式?分享两种简单好用的转换方法

怎么把epub格式的文件转换成PDF文件格式呢&#xff1f;这两种文件格式大家在下载文件的时候可能会经常遇到&#xff0c;PDF文件格式自然不用多说&#xff0c;这是大家办公必备文件&#xff0c;但是epub格式的文件是一种电子书格式的文件&#xff0c;很多小伙伴用不习惯&#xf…

Linux基本指令(一)

文章目录Linux常用基本指令1. ls2. pwd3. cd4. touch5. tree6. mkdir7. rmdir8. rm9. man10. cp11. mv12. cat13. echo14. wc15. more16. less17. head18. tail19. date20. cal21. sort22. uniq23. find24. which25. whereis26. alias27. grep28. zip/unzip29. tar30. bc31. un…

MyBatisPlus入门学习笔记

目录 学习笔记 SQL文件 练习类 其他知识点 yaml配置文件 代码生成器 学习笔记 SQL文件 SQL SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS u…

图/图的存储/图的遍历

图的概念&#xff1a;图的数据结构由两个集合构成&#xff0c;一个是顶点集V (vertex)&#xff0c;一个是边集E&#xff08;Edge&#xff09;&#xff1b;无向图一般记为G(V , E) &#xff1b;有向图记为 G<V&#xff0c; E> 有向图就是边的指向是有方向区分的&#xff…

CPT-PLGA/FITC/Bodipy/Biotin聚乳酸共聚物/荧光素/生物素/Bodipy系列染料修饰顺铂的制备

今天小编分享的知识是CPT-PLGA/FITC/Bodipy/Biotin聚乳酸共聚物/荧光素/生物素/Bodipy系列染料修饰顺铂&#xff0c;下面一起来看&#xff01; CPT-11-PLGA纳米粒制备研究&#xff1a; 将CPT-11负载于可生物降解的高分子聚合物聚乳酸-羟基乙酸共聚物(PLGA)中,制备成具有缓释性…

Hive 之拉链表

文章目录什么是拉链表&#xff1f;如何实现拉链&#xff1f;拉链表实现示例什么是拉链表&#xff1f; 一张存储历史数据的表&#xff0c;记录数据由 “生” 到 “死” 的过程&#xff0c;用于处理缓慢变化维。 好处是拉链表可以保存每条数据的所有历史记录&#xff0c;轨迹十…