Vue2(十):全局事件总线、消息订阅与发布、TodoList的编辑功能、$nextTick、动画

一、全局事件总线!!

任意组件间通信

比如a想收到别的组件的数据,那么就在a里面给x绑定一个demo自定义事件,所以a里面就得有一个回调函数吧,然后我要是想让d组件给a穿数据,那就让d去触发x的自定义事件,并且传参数进去,那么触发自定义事件就也会调用回调函数,就把数据给到a了 

1.安装全局事件总线

那么x应该放到哪里呢?之前学prototype的时候说它可以让vc、vm都能找到,x放在vue的原型对象上,x写到main.js中

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

注意$on、$off只有vm、vc才能用,如果把创建为一个新的vc可以实现,但是代码有点多,我们就把它创建成一个vm,有一个现成的vm让x直接等于它,写在new Vue后边呢在模版解析完之后才能赋值太晚了,所以就用钩子来赋值。(x一般写成$bus)

2.使用事件总线

a组件要绑定自定义事件

mounted(){
			this.$bus.$on('hello',(data)=>{
				console.log('我是school,我收到了',data)
			})
		}

3.提供数据

x中开始调用触发

<button @click="sendName">点我把数据传给school</button>
methods:{
			sendName(){
				this.$bus.$emit('hello',666)
			}
		}

注意:1.我们会有很多条线调用两个组件一个方法名,这些方法名不能重复

2.我们在销毁之前要把事件解绑

4.解绑事件

在哪儿绑的在哪儿解,为啥之前的自定义事件销毁之前不去解绑呢?因为之前那些组件销毁的话身上的自定义事件就一起嘎了,但是这个无论哪个组件销毁x都一直在,组件都销毁了还留着事件那x太累了

beforeDestroy(){
			this.$bus.$off('hello')
		}

5.TodoList中的孙传父

app里传给list再传给item的函数全都不要了

mounted(){
    // this.$bus.on('checkTodo',(id)=>{
    //   this.checkTodo(id)
    // }), 不是这么写啊,这里是事件名和事件函数,我本来就是要触发那个函数,而且函数已经写好了直接用

    this.$bus.$on('deleteTodo',this.deleteTodo)
    this.$bus.$on('checkTodo',this.checkTodo)
  },
  beforeDestroy(){
    this.$bus.$off(['checkTodo','deleteTodo'])
  }

item:

methods: {
    handleCheck(id){
    this.$bus.$emit('checkTodo',id)
   },
   handleDelete(id){
     this.$bus.$emit('deleteTodo',id)
   }
   },

检查vue中如果sourse为root那一般就是$bus

二、消息订阅与发布(pubsub)

在vue里用的不多

在a(需要消息)组件里我们订阅了一个demo的消息,内容是test,然后c(提供数据、发布消息)一旦发布demo的消息并传参666,那么a就会立马收到

1.使用方法

需要引入pubsub-js库,可以在任何一个框架使用

安装pubsub:npm i pubsub-js
引入:import pubsub from 'pubsub-js

接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。

mounted(){
			// this.$bus.$on('hello',(data)=>{
			// 	console.log('我是school,我收到了',data)
			// })
			this.pubid=pubsub.subscribe('hello',(msgName,data)=>{
				console.log('dingyuele ',msgName,data)
			})
        //两个参数第一个是事件名,第二个是(事件名,数据)
		},
		beforeDestroy(){
			// this.$bus.$off('hello')
			pubsub.unsubscribe(this.pubid)
			//括号里面写‘hello’不对,每次订阅消息都有一个订阅id,类似定时器
			//上面和这里不写this找不到
		}

提供数据:

methods:{
			sendName(){
				pubsub.publish('hello',666)
			}
		}

2.TodoList中用pubsub

第三方Vue中不支持查看

我们来修改一下todolist 的delete方法,app:

import pubsub from 'pubsub-js'

//mounted:

this.pubId=pubsub.subscribe('deleteTodo',this.deleteTodo)
  },
  beforeDestroy(){
    //this.$bus.$off(['checkTodo'])
    pubsub.unsubscribe(this.pubId)
  }

item:

handleDelete(id){
     //this.$bus.$emit('deleteTodo',id)
     pubsub.publish('deleteTodo',id)
   }

然后我们之前不是说会传参过来两个吗,一个是函数名,一个是形参,但是函数名我们其实不太需要,这个里面调的是methods里面我们写好的函数,所以就用_占位一下

deleteTodo(_,id)
//传不都是传两个参数吗,用这个_占位

这里没有用箭头函数是我们的函数写在了methods里面,this(delete里的this)就是vm

(为啥要让里面函数的this指向vm?存个疑)

三、TodoList的编辑功能

1.点击获取

首先实现在每个爱好的后面再加一个按钮编辑,让文字处于input框中

在处于input框中的时候,就应该是文字在框里面,编辑完成之后又得恢复成文字样式,所以还得设置一个todo.isEdit来判断当前的todo是不是在编辑中

<span v-show="!todo.isEdit">{{todo.title}}</span>
      <input v-show="todo.isEdit" type="text" 
      :value="todo.title" > 

isEdit为true的时候,表单就出来,否则就隐藏,因为变换比较多的问题这里不用v-if

然后开始添加点击之后让isEdit为true

handleEdit(todo){
     //todo.isEdit=true 这么加只是表层加了,isEdit没有getter、setter
     //这样每次都追加的写法有点不好,因为你第一次编辑确实得加这个属性,但是第二次就没必要了
     
       this.$set(todo,'isEdit',true)
   },

但是这样会让每次点击都重新添加isEdit属性不管你以前有没有

   handleEdit(todo) {
        if (todo.isEdit !== undefined) {
            todo.isEdit = true;
        } else {
            this.$set(todo, 'isEdit', true);
        }
    },

老师讲的是hasOwnProperty方法,但是报错说我电脑没有这个我就没用

2.失去焦点

失去焦点之后,isEdit为false,表单消失,而且之前修改的内容需要改到我们的文字里面,注意传的是input表单的value而不是todo.title

<input v-show="todo.isEdit" type="text" 
      :value="todo.title" 
      @blur="handleBlur(todo,$event)"> 
//失去焦点真正执行修改
   handleBlur(todo,e){
     //现在的todo已经有isEdit属性了
     todo.isEdit=false
     this.$bus.$emit('updataTodo',todo.id,e.target.value)
   }

用全局事件来修改app里的数据,在item中触发updateTodo事件

app:遍历数组看谁的id和我传的一样就修改它的title

updateTodo(id,title){
      this.todos.forEach((todo)=>{
        if(todo.id==id) {todo.title=title}
        
      })
    },
mounted(){
    this.$bus.$on('updateTodo',this.updateTodo)
}
beforeDestroy() {
    this.$bus.$off('editTodo');
},

四、$nextTick

1、语法:this.$nextTick(回调函数)
2、作用:在下一次 DOM 更新结束,v-for循环结束后执行其指定的回调。
3、什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时(如input自动获取焦点),要在nextTick所指定的回调函数中执行。

我点击了编辑按钮之后我想让他自动获取焦点,如果直接写this.$refs.inputTitle.focus()的话,模版解析等这个函数走完了才显示在页面上,但是那个时候就focus完了,在handleEdit(todo)用$nextTick。

this.$nextTick(function (){
        this.$refs.inputTitle.focus()
      });

五、动画

1.动画效果

transition标签在html中不显示,是vue提供的,可以在style设置来去的动画,appear默认打开页面就出现 来 的动画

<button @click="isShow = !isShow">显示/隐藏</button>
    <transition name="hello" :appear="true">
        <!-- appear="true"这样会报错因为人家要的是布尔值不是字符串 -->
        <!-- :appear="true"简写为appear -->
    <h1 v-show="isShow">你好啊</h1>
    </transition>
.hello-enter-active{
    animation: atguigu 1s;
}
.hello-leave-active{
    animation: atguigu 1s reverse;
}
@keyframes atguigu {
    from{
        transform: translateX(-100%);
    }
    to{
        transform: translateX(0px);
    }
}

2.用过渡实现以上效果

元素进入的样式:
v-enter:进入的起点
v-enter-active:进入过程中
v-enter-to:进入的终点

元素离开的样式:
v-leave:离开的起点
v-leave-active:离开过程中
v-leave-to:离开的终点

.hello-enter,.hello-leave-to{
    /* 进入的起点 */
    transform: translateX(-100%);
    
}
.hello-enter-to,.hello-leave{
/* 进入的终点 */
transform: translateX(0);
}
.hello-enter-active,.hello-leave-active{
 transition: 0.5s linear;
}

3.多个元素实现过渡

transition-group

<template>
  <div>
    <button @click="isShow = !isShow">显示/隐藏</button>
    <transition-group name="hello" :appear="true">
        <!-- appear="true"这样会报错因为人家要的是布尔值不是字符串 -->
        <!-- :appear="true"简写为appear -->
    <h1 v-show="isShow" key="1">你好啊</h1>
    <h1 v-show="isShow" key="2">你好啊</h1>
    </transition-group>
  </div>
</template>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-tree 使用按钮切换当前选中的节点(上一节点,下一节点)

<!-- 选择树上下切换 --> <template><div><el-tree:data"treeData":props"defaultProps"node-key "id"ref"tree"node-click"handleNodeClick"></el-tree><div><el-button click&qu…

Github Action Auto build docker Auto deploy

简介 整个流程比较清晰&#xff0c;实现的是基于Github 定向的往ECS做发布 探索 自动化打包发布一般流程&#xff1a; 本地环境打镜像 CI/CD 环境打镜像 以上的流程使用于比较大的项目&#xff0c;受限于环境&#xff0c;打算对上面流程做简化&#xff0c;使用github acti…

SpringBoot3+Vue3项目的阿里云部署--将后端以及前端项目打包

一、后端&#xff1a;在服务器上制作成镜像 1.准备Dockerfile文件 # 基础镜像 FROM openjdk:17-jdk-alpine # 作者 MAINTAINER lixuan # 工作目录 WORKDIR /usr/local/lixuan # 同步docker内部的时间 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ…

Path MTU(路径最大传输单元)

目录 前言&#xff1a; IPV6不支持中间设备分片原因&#xff1a; IPV6报文分片使用的扩展报头&#xff08;44&#xff09;所包含的参数 IPv6报文分片过程 源节点分片数据包 前言&#xff1a; 在IPv4网络中&#xff0c;报文如果过大&#xff0c;则需要分片进行发送&#xf…

网络核心知识点 - 网络通信技术 XHR(XMLHttpRequest) 和 Fetch

一、关于 AJAX&#xff08;一种思想和方法&#xff09; 浏览器本身就具备网络通信的能力&#xff0c;但在早期&#xff0c;浏览器并没有把这个能力开放给JS。最早是微软在IE浏览器中把这一能力向JS开放&#xff0c;让JS可以在代码中实现发送请求&#xff0c;并不会刷新页面。Aj…

MS5910PA——10到16bit、内置参考振荡器 R/D转换器,替代AD2S1210

产品简述 MS5910PA 是一款可配置 10bit 到 16bit 分辨率的旋 变数字转换器。片上集成正弦波激励电路&#xff0c;正弦和余弦 允许输入峰峰值幅度为 2.3V 到 4.0V &#xff0c;频率范围为 2kHz 至 20kHz 。 转换器可并行或串行输出角度和速度对应的 数字量。 MS…

计算机软件安全

一、软件安全涉及的范围 1.1软件本身的安全保密 软件的本质与特征&#xff1a; 可移植性 寄生性 再生性 可激发性 攻击性 破坏性 …… 知识产权与软件盗版 软件商品交易形式不透明&#xff0c;方式多样&#xff0c;传统商标标识方法不适用&#xff1b; 盗版方法简捷…

IntelliJ IDEA集成git配置账号密码

1 背景说明 刚使用IDEA&#xff0c;本地也安装Git&#xff0c;在提交和拉取代码的时候&#xff0c;总提示登录框&#xff0c;而且登录框还不能输入账号密码&#xff0c;只能输入登录Token。如下&#xff1a; 从而无法正常使用IDEA的Git功能&#xff0c;很苦恼。 2 解决方法 …

C语言数据结构易错知识点(5)(插入排序、选择排序)

插入排序&#xff1a;直接插入排序、希尔排序 选择排序&#xff1a;直接选择排序、堆排序 上述排序都是需要掌握的&#xff0c;但原理不会讲解&#xff0c;网上有很多详尽地解释&#xff0c;本文章主要分享一下代码实现上应当注意的事项 1.直接插入排序&#xff1a; 代码实…

FastWiki(增强AI对话功能)企业级智能客服功能介绍

知识库对话功能 什么是知识库对话&#xff1f; 我们需要找到AI的知识能力是有限的他们的知识都截止于他们训练数据的时间&#xff0c;你提问他们更新的数据的时候他们就会出现乱回复。而知识库则是利用Prompt给于AI更多的知识从而让他回复更准确&#xff0c; 以下就是知识库的…

如何通过idea搭建一个SpringBoot的Web项目(最基础版)

通过idea搭建一个SpringBoot的Web项目 文章目录 通过idea搭建一个SpringBoot的Web项目一、打开idea&#xff0c;找到 create new project二、创建方式三、配置项目依赖四、新建项目模块五、总结 一、打开idea&#xff0c;找到 create new project 方式1 方式2 二、创建方式 新…

更换 Jenkins 插件下载源(解决 Jenkins 插件安装失败)【图文详细教程】

Jenkins 插件安装失败的情况 这里提一下&#xff0c;Jenkins 插件安装失败&#xff0c;不一定是下载源的问题&#xff0c;还有可能你下载的 Jenkins 的版本与插件的版本不匹配&#xff0c;Jenkins 的版本较低&#xff0c;而安装的插件是为新的 Jenkins 版本准备的&#xff0c;此…

领域、系统和组织-《实现领域驱动设计》中译本评点-第2章(4)

相关链接 DDD领域驱动设计批评文集>> 汪峰哭晕在厕所-《实现领域驱动设计》中译本评点-第2章&#xff08;1&#xff09; 可不是乱打的-《实现领域驱动设计》中译本评点-第2章&#xff08;2&#xff09; “领域”的错误定义-《实现领域驱动设计》中译本评点-第2章&…

牛客题霸-SQL篇(刷题记录三)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 以下内容是…

笔试总结01

1、spring原理 1、spring原理 spring的最大作用ioc/di,将类与类的依赖关系写在配置文件中&#xff0c;程序在运行时根据配置文件动态加载依赖的类&#xff0c;降低的类与类之间的藕合度。它的原理是在applicationContext.xml加入bean标记,在bean标记中通过class属性说明具体类…

Mamba 基础讲解【SSM,LSSL,S4,S5,Mamba】

文章目录 Mamba的提出动机TransformerRNN Mama的提出背景状态空间模型 (The State Space Model, SSM)线性状态空间层 (Linear State-Space Layer, LSSL)结构化序列空间模型 &#xff08;Structured State Spaces for Sequences, S4&#xff09; Mamba的介绍Mamba的特性一&#…

天软高频因字库——委托订单因子及资金流向因子发布

天软始终致力于构建完善而丰富的因子库服务体系&#xff0c;陆续推出了股票因子、基金因子、指数因子等众多因子数据及评价数据。 本月天软推出高频委托订单&资金流向相关因子&#xff0c;继续补充和完善天软高频特色因子库&#xff0c;至此该因子库已包含36个因子表单&…

基于SpringBoot+Vue共享客栈管理系统(源码+部署说明+演示视频+源码介绍+lw)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

Pycharm配置conda

1.下载conda Free Download | Anaconda . 2.配置环境 1.conda自带base环境 2.创建环境 3. Pycharm创建项目&#xff0c;选择环境 3.Pycharm中新建conda环境

win11 安装SIBR 3dgs

1.安装显卡驱动 下载地址&#xff1a; 官方驱动 | NVIDIA下载适用于 GeForce、TITAN、NVIDIA RTX、数据中心、GRID 等 NVIDIA 产品的新驱动。https://www.nvidia.cn/Download/index.aspx?langcn 2.安装cuda 下载地址&#xff1a;如果无法打开&#xff0c;切换.com为.cn&am…