vue2基础组件通信案例练习:把案例Todo-list改成使用全局事件总线

Vue06 全局事件总线 TodoList-事件总线 消息订阅与发布 TodoList-pubsub TodoList-编辑$nextTick 动画效果 github案例 全局事件总线 TodoList-事件总线 消息订阅与发布 TodoList-pubsub TodoList-编辑$nextTick 动画效果 过度效果 配置代理_方式一二 github案例 阅读详情

在这里插入图片描述

改动的地方

注意点1:使用地方App和MyItem之间使用全局事件总线,之前方式是App传给MyList,然后MyList再传给MyItem,之前缺陷是MyList只作为传递着啥都不干,显得太绕圈,太多余。

main.js

new Vue({
	el:'#app',
	render: h => h(App),
	beforeCreate() {
		Vue.prototype.$bus = this
	},
})

App.vue

methods: {
//勾选or取消勾选一个todo
	checkTodo(id){
		this.todos.forEach((todo)=>{
			if(todo.id === id) todo.done = !todo.done
		})
	}
},
mounted() {
	this.$bus.$on('checkTodo',this.checkTodo)
	this.$bus.$on('deleteTodo',this.deleteTodo)
},
beforeDestroy() {
	this.$bus.$off('checkTodo')
	this.$bus.$off('deleteTodo')
},

MyItem.vue

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

methods: {
	//勾选or取消勾选
	handleCheck(id){
		//通知App组件将对应的todo对象的done值取反
		// this.checkTodo(id)
		this.$bus.$emit('checkTodo',id)
	},
	//删除
	handleDelete(id){
		if(confirm('确定删除吗?')){
			//通知App组件将对应的todo对象删除
			// this.deleteTodo(id)
			this.$bus.$emit('deleteTodo',id)
		}
	}
},

案例全部代码

main.js

main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
	beforeCreate() {
		Vue.prototype.$bus = this
	},
})

App.vue

App.vue




<MyHeader @addTodo=“addTodo”/>

<MyFooter :todos=“todos” @checkAllTodo=“checkAllTodo” @clearAllTodo=“clearAllTodo”/>




MyHeader.vue

MyHeader.vue

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

<script>
	import {nanoid} from 'nanoid'
	export default {
		name:'MyHeader',
		data() {
			return {
				//收集用户输入的title
				title:''
			}
		},
		methods: {
			add(){
				//校验数据
				if(!this.title.trim()) return alert('输入不能为空')
				//将用户的输入包装成一个todo对象
				const todoObj = {id:nanoid(),title:this.title,done:false}
				//通知App组件去添加一个todo对象
				this.$emit('addTodo',todoObj,1,2,3)
				//清空输入
				this.title = ''
			}
		},
	}
</script>

<style scoped>
	/*header*/
	.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(82, 168, 236, 0.8);
		box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
	}
</style>

MyList.vue

MyList.vue

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

<script>
	import MyItem from './MyItem'

	export default {
		name:'MyList',
		components:{MyItem},
		//声明接收App传递过来的数据
		props:['todos']
	}
</script>

<style scoped>
	/*main*/
	.todo-main {
		margin-left: 0px;
		border: 1px solid #ddd;
		border-radius: 2px;
		padding: 0px;
	}

	.todo-empty {
		height: 40px;
		line-height: 40px;
		border: 1px solid #ddd;
		border-radius: 2px;
		padding-left: 5px;
		margin-top: 10px;
	}
</style>

MyItem.vue

MyItem.vue

<template>
	<li>
		<label>
			<input type="checkbox" :checked="todo.done" @change="handleCheck(todo.id)"/>
			<!-- 如下代码也能实现功能,但是不太推荐,因为有点违反原则,因为修改了props -->
			<!-- <input type="checkbox" v-model="todo.done"/> -->
			<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'],
		methods: {
			//勾选or取消勾选
			handleCheck(id){
				//通知App组件将对应的todo对象的done值取反
				// this.checkTodo(id)
				this.$bus.$emit('checkTodo',id)
			},
			//删除
			handleDelete(id){
				if(confirm('确定删除吗?')){
					//通知App组件将对应的todo对象删除
					// this.deleteTodo(id)
					this.$bus.$emit('deleteTodo',id)
				}
			}
		},
	}
</script>

<style scoped>
	/*item*/
	li {
		list-style: none;
		height: 36px;
		line-height: 36px;
		padding: 0 5px;
		border-bottom: 1px solid #ddd;
	}

	li label {
		float: left;
		cursor: pointer;
	}

	li label li input {
		vertical-align: middle;
		margin-right: 6px;
		position: relative;
		top: -1px;
	}

	li button {
		float: right;
		display: none;
		margin-top: 3px;
	}

	li:before {
		content: initial;
	}

	li:last-child {
		border-bottom: none;
	}

	li:hover{
		background-color: #ddd;
	}
	
	li:hover button{
		display: block;
	}
</style>

MyFooter.vue

MyFooter.vue

<template>
	<div class="todo-footer" v-show="total">
		<label>
			<!-- <input type="checkbox" :checked="isAll" @change="checkAll"/> -->
			<input type="checkbox" v-model="isAll"/>
		</label>
		<span>
			<span>已完成{{doneTotal}}</span> / 全部{{total}}
		</span>
		<button class="btn btn-danger" @click="clearAll">清除已完成任务</button>
	</div>
</template>

<script>
	export default {
		name:'MyFooter',
		props:['todos'],
		computed: {
			//总数
			total(){
				return this.todos.length
			},
			//已完成数
			doneTotal(){
				//此处使用reduce方法做条件统计
				/* const x = this.todos.reduce((pre,current)=>{
					console.log('@',pre,current)
					return pre + (current.done ? 1 : 0)
				},0) */
				//简写
				return this.todos.reduce((pre,todo)=> pre + (todo.done ? 1 : 0) ,0)
			},
			//控制全选框
			isAll:{
				//全选框是否勾选
				get(){
					return this.doneTotal === this.total && this.total > 0
				},
				//isAll被修改时set被调用
				set(value){
					// this.checkAllTodo(value)
					this.$emit('checkAllTodo',value)
				}
			}
		},
		methods: {
			/* checkAll(e){
				this.checkAllTodo(e.target.checked)
			} */
			//清空所有已完成
			clearAll(){
				// this.clearAllTodo()
				this.$emit('clearAllTodo')
			}
		},
	}
</script>

<style scoped>
	/*footer*/
	.todo-footer {
		height: 40px;
		line-height: 40px;
		padding-left: 6px;
		margin-top: 5px;
	}

	.todo-footer label {
		display: inline-block;
		margin-right: 20px;
		cursor: pointer;
	}

	.todo-footer label input {
		position: relative;
		top: -1px;
		vertical-align: middle;
		margin-right: 5px;
	}

	.todo-footer button {
		float: right;
		margin-top: 5px;
	}
</style>

本人其他相关文章链接

1.《基础篇第1章:vue2简介》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

2.《基础篇第2章:vue2基础》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

3.《进阶篇第3章:vue进阶-组件》包含组件、自定义事件、插槽、路由等等扩展知识点

4.《基础篇第4章》:使用vue脚手架创建项目

5.vue2知识点:数据代理

6.vue2知识点:事件处理

7.vue2知识点:列表渲染(包含:v-for、key、取值范围、列表过滤、列表排序、vue监视对象或数组的数据改变原理、总结vue数据监测)

8.vue2知识点:计算属性与监听属性

9.vue2知识点:生命周期(包含:生命周期介绍、生命周期钩子、整体流程图详解)

10.vue2知识点:非单文件组件和单文件组件

11.vue2知识点:组件is属性

12.vue2知识点:组件模板定义

13.vue2知识点:组件的props属性、非props属性、props属性校验

14.vue2知识点:组件自定义事件

15.vue2知识点:组件插槽分发

16.vue2知识点:动态组件

17.vue2知识点:混入

18.vue2知识点:浏览器本地缓存

19.vue2知识点:全局事件总线(GlobalEventBus)

20.vue2知识点:消息订阅与发布

21.vue2知识点:nextTick语法

22.vue2知识点:Vue封装的过度与动画

23.vue2知识点:路由

24.vue2知识点:vm调用待$命令介绍

25.vue组件通信案例练习(包含:父子组件通信及平行组件通信)

26.vue表单案例练习:vue表单创建一行数据及删除数据的实现与理解

27.vue2基础组件通信案例练习:待办事项Todo-list案例练习

28.vue2基础组件通信案例练习:把案例Todo-list改写成本地缓存

29.vue2基础组件通信案例练习:把案例Todo-list改成使用自定义事件

30.vue2基础组件通信案例练习:把案例Todo-list改成使用全局事件总线

31.vue2基础组件通信案例练习:把案例Todo-list改成使用消息订阅与发布

32.vue2基础组件通信案例练习:把案例Todo-list新增编辑按钮

33.vue2基础组件通信案例练习:把案例Todo-list改成使用动画与过度

34.学习vue2遇到过的问题及个人总结

Vue CLI 全局事件总线 消息的订阅与发布 阅读详情

相关推荐

unity中判断是否联网,判断网络状态的两种方式

unity中判断是否联网,判断网络状态的两种方式

wla2996gpy032的博客 1873

【Vue】Vue2.0+Vue3.0学习笔记day09(TodoList案例完善)

目录 080.组件自定义事件_绑定 081.组件自定义事件_解绑 082.组件自定义事件_总结 083.TodoList案例_自定义事件 084.全局事件总线1 085.全局事件总线2 086.TodoList案例_事件总线 087.消息订阅与发布_pubsub 088.TodoList案例_pubsub 089.TodoList案例_编辑 080.组件自定义事件_绑定 <template> <div class="app"> ...

weixin_58214412的博客 648

基于51单片机语音识别智能台灯设计

智能台灯;语音识别;STC89C52RC单片机

Benso_H的博客 5834

Vue小练习-搜索框输入练习

这是一个使用vue2的搜索框小练习,实现在搜索框输入内容,敲击回车返回结果的效果。这里调用了 axios库向GitHub发送请求,并返回请求。因为是个小练习,我就往简单的做,就不用脚手架了。

weixin_73368873的博客 654

Win11用户文件夹中文名修改全攻略

本文详细介绍了Windows 11系统中修改中文用户文件夹名称的完整步骤。操作包含七个关键环节:前期数据备份、账户名称修改、管理员账户激活、用户文件夹重命名、注册表路径更新、收尾操作及注意事项。特别强调需要同步修改账户名、文件夹名和注册表关联路径,并建议操作前备份重要数据。文中还针对常见问题提供了解决方案,如软件报错时的符号链接创建方法。整个过程需谨慎操作,建议在管理员权限下逐步执行,修改完成后需验证系统及软件功能是否正常。

Qinti_mm的博客 3097

(详细总结)python爬取 163收件箱邮件内容,收件箱列表的几种方法(urllib, requests, selenium)

需求:最近有一个需求,需要将163邮箱收件箱里面的所有邮件的内容全部copy下来,整理到一个word里面,不多也就28页的邮件(不要问我为什么有这需求,不告诉你),自己手动去ctrl+ cv 的话,估计要搞吐。然后就想能不能用python的爬虫来实现,虽然过程比较苦(后期改bug改的要吐了)。但是会后还是将需求实现了。这基本也算是入门了 urllib、requests、selenium这几个py...

man_tou_22 1万+

vue2练习五个小例子笔记

https://segmentfault.com/a/1190000008436978 主题 Vue.js vue2练习五个小例子笔记 多练习,多撸代码,多进步. 基于vue2 1.双向数据绑定 div id="main" @click="hideTooltip"> div class="tooltip" v-if="show_tooltip" @c

打杂人-aerchi 6537

Loki 分布式日志中心服务

分布式日志中心 Loki + Promtail + Grafana

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 2347

Vue-----带有动画效果的todo_list案例

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

m0_62907534的博客 543

MicroPython学习:在STM32上进行移植

本文将介绍如何在STM32上移植MicroPython,并提供相应的源代码。通过以上步骤,你已经成功地将MicroPython移植到STM32上,并可以使用MicroPython语言编写和运行代码。你可以进一步探索MicroPython的功能和API,以利用STM32的各种外设和功能。使用STM32CubeProgrammer或其他适当的烧录工具,将编译生成的MicroPython固件烧录到STM32微控制器中。打开该文件,并根据你的STM32微控制器类型进行必要的配置更改。模块来控制STM32的LED。

JeeVue的博客 1233

SPICE仿真软件:HSPICE_(20).HSPICE仿真结果的后处理

HSPICE仿真结果的后处理是一个多步骤的过程,包括读取结果文件、可视化、分析和导出。通过使用命令行工具、Python脚本和HSPICE内置工具,可以高效、准确地完成这些任务。Python脚本的灵活性和强大的数据分析能力使其成为后处理的理想选择。自动化处理可以显著提高工作效率,减少人为错误,而高级分析方法可以更深入地理解仿真结果,为电路设计提供有力支持。

kkchenjj的博客 1375

vue2基础组件通信案例练习:把案例Todo-list改写成本地缓存

文章目录概述 概述 前面文章案例已经练习了父子组件之间的通信,这一节讲述如何把todos数组放进本地缓存中,因为实际开发场景中频繁查询的数据很有可能会用到本地缓存技术。 思考:如何改成使用本地缓存,是写一堆按钮每次触发就是往本地缓存种get和set?答案是错误的,因为太复杂了会写一堆的get和set方法 正确答案:使用监听watch属性,因为只要监听到数据改变 =》 往本地缓存种添加监听改变后的数据就行,这样就能实现本地缓存的更新。 App.vue 只写了代码不同的地方 export d.

刘大猫 648

Monorepo与pnpm:前端项目管理的完美搭档

pnpm又称 performant npm,翻译过来就是高性能的npm。Monorepo是一种项目开发与管理的策略模式,它代表"单一代码仓库"(Monolithic Repository)。在Monorepo模式中,所有相关的项目和组件都被存储在一个统一的代码仓库中,而不是分散在多个独立的代码仓库中,这些项目之间还可能会有依赖关系。

m0_68271787的博客 2557

vue2基础组件通信案例练习:待办事项Todo-list案例练习

vue2基础组件通信案例练习:待办事项Todo-list案例练习

刘大猫 1469

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Vue2学习day05—Todo-list案例

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

Happy_change的博客 2888

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

vue2基础组件通信案例练习:把案例Todo-list新增编辑按钮

文章目录改动的地方案例全部代码main.jsApp.vueMyHeader.vueMyList.vueMyItem.vueMyFooter.vue 改动的地方 注意点1:改动App和MyItem页面 注意点2: 问题:为啥按钮的css样式要放在App.vue中而不是放在MyItem.vue中? 答案:为了统一样式,把所有样式都放在App.vue中,这样子组件引用后按钮样式会全局统一。 注意点3:动态给todo添加属性isEdit属性,下面写法是错误的,因为isEdit 属性确实可以写入todo中,但.

刘大猫 924

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

vue2基础组件通信案例练习:把案例Todo-list改成使用动画与过度

文章目录改动的地方案例全部代码main.jsApp.vueMyHeader.vueMyList.vueMyItem.vueMyFooter.vue 改动的地方 注意点:让每一个添加和删除的操作有一个柔和的动画效果,有两种方式。方式1:在MyItem添加动画效果使用<transition>标签;方式2:在MyList中添加效果使用<transition-group>标签。下面案例代码使用方式2。 MyList.vue <transition-group name="todo.

刘大猫 492

vue2基础组件通信案例练习:把案例Todo-list改成使用自定义事件

文章目录改动的地方案例全部代码main.jsApp.vueMyHeader.vueMyList.vueMyItem.vueMyFooter.vue 改动的地方 使用地方App和MyFooter之间使用自定义事件传值 App.vue <MyFooter :todos="todos" @checkAllTodo="checkAllTodo" @clearAllTodo="clearAllTodo"/> methods: { checkAllTodo(done){ this.todos.

刘大猫 623

vue2基础组件通信案例练习:把案例Todo-list改成使用消息订阅与发布

文章目录改动的地方案例全部代码main.jsApp.vueMyHeader.vueMyList.vuemain.jsMyFooter.vue 改动的地方 注意点1:实现App和MyItem的删除功能,使用消息订阅与发布方式实现通信。 App.vue import pubsub from 'pubsub-js' methods: { //删除一个todo deleteTodo(_,id){ this.todos = this.todos.filter( todo => todo.id !=.

刘大猫 443

Vue 学习笔记07:Todo-list 案例

Todo-list 案例一、组件化编码流程二、props 扩展三、webStorage四、自定义事件五、全局事件总线六、消息订阅与发布七、nextTick八、案例代码1. Header2. List3. Item4. Footer5. App.vue6. main.js 一、组件化编码流程 拆分静态组件:组件要按照功能点拆分,命名不要与 html 元素冲突。 实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件再用: (1)一个组件在用:放在组件自身即可。 (2)一些组件再用:放在他们共同

iFulling的博客 1313

《基础篇第1章:vue2简介》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

《基础篇第1章:vue2简介》包含Vue2知识点、个人总结的使用注意点及碰到的问题总结

刘大猫 2609

第 3 章:使用 Vue 脚手架

1. 初始化脚手架 1.1 说明 Vue 脚手架是 Vue 官方提供的标准化开发工具(开发平台)。 最新的版本是 5.x。 文档: https://cli.vuejs.org/zh/ 1.2 具体步骤 第一步(仅第一次执行):全局安装@vue/cli。 npm install -g @vue/cli 第二步:切换到你要创建项目的目录,然后使用命令创建项目 vue create xxxx(项目名称) 第三步:启动项目 npm run serve 备注: 如出现下载缓慢请配置 npm 淘宝镜像: np

2203_75300307的博客 1993

Todo-List案例版本四

a.接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。b.提供数据:this.$bus.$emit('xxx',data)

bubbleJessica的博客 565

Vue CLI Todo-List案例

Vue CLI Todo-List案例

weixin_44230693的博客 480

实战篇:(十二)使用 Vite + Vue3 + TypeScript 创建 Todo List 示例:父子组件的事件通信

我们首先创建一个基础的 Vue 组件,并使用 TypeScript 为其 props 和状态(state)添加类型注解。在这个组件中,我们使用了props传递,并为其类型定义为number。此外,我们还通过明确指定count的类型为数字,并用 TypeScript 注解了increment函数的返回值类型。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1215

Vue2(五)待办事项todo-list小案例

现实中一个这样的案例不需要拆成很多个小组件,一个就搞定,不过为了更好的了解学习小知识点进行一个拆分是很有意义的。通过这个案例,编写组件的思路更加清晰,一步一步循序渐进,感觉还不错。学到了很多细碎的知识点。1.目前还没有学到事件总线,所以同级组件之间的数据交互是通过最基础的方式:数据放在父组件,再将数据传递给子组件;同时学到了重要的一点:父组件的函数也可以通过props属性传递给子组件,从而通过操作子组件实现父组件数据的交互。

DogEgg_001的博客 2031
上一篇: vue2基础组件通信案例练习:把案例Todo-list改成使用自定义事件
下一篇: vue2基础组件通信案例练习:把案例Todo-list改成使用消息订阅与发布
刘大猫.
博客等级 码龄9年 6万+粉丝 730原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

刘大猫.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值