首页 > 其他分享 >Vue CLI 系列之(十一)组件自定义事件

Vue CLI 系列之(十一)组件自定义事件

时间:2024-02-29 19:55:21浏览次数:25  
标签:触发 Vue CLI 自定义 绑定 事件 atguigu 组件

组件自定义事件

区别于js内置事件,内置事件是给html元素用的,而自定义事件是给组件用的

1. 给组件实例对象绑定自定义事件

  • 给组件绑定自定义事件

v-on:自定义事件名="回调函数"

比如:<Student v-on:atguigu="demo"/>

上面代码的含义为:由于v-on是在Student这个组件标签上,所以是给student组件的实例对象身上绑定了一个事件,事件名称是atguigu,如果有人触发了这个事件,回调函数demo就会被调用

  • 如何触发自定义事件

原则:给谁绑的事件,就找谁触发事件

触发:vc.$emit("自定义事件名")

触发时传递数据:vc.$emit("自定义事件名", 数据...)

  • 实现子组件给父组件传递数据的几种方式
<!-- 通过父组件给子组件传递函数类型的props【传递的是一个函数】实现:子给父传递数据 -->
<School :getSchoolName="getSchoolName"/>

<!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第一种写法,使用@或v-on) -->
<Student @atguigu="getStudentName"/>

<!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第二种写法,使用ref) -->
<Student ref="student"/>
  • 通过props实现子组件给父组件传递数据和通过自定义事件实现子组件给父组件传递数据的区别

第一种方式需要子组件接收并亲自调用回调函数,第二种方式只需要绑定事件时设置好回调函数,子组件中触发事件即可

  • 绑定自定义事件的两种方式:这两种方式的不同体现在自定义事件绑定方式的不同,触发方式是相同的

    第一种方式,使用@或v-on

<!--父组件-->
<Student @atguigu="getStudentName"/>

methods:{
  //atguigu事件的回调中能够接收到子组件触发事件时传递的数据
  getStudentName(name,x,y){
  	console.log('demo被调用了', name,x,y)
  }
}

<!--子组件-->
<button type="button" @click="sendStudentNameToApp">传递数据给父组件</button>

methods:{
  sendStudentNameToApp(){
	//通过vc.$emit触发绑定的atguigu事件并进行传参
  	this.$emit('atguigu',this.name,'a',true)
  }
}

​ 第二种方式,使用ref,灵活性强,支持异步操作【定时器、Ajax请求】

<!--父组件-->
<Student ref="student"/>

methods:{
  getStudentName(name,x,y){
  	console.log('demo被调用了', name,x,y)
  }
},
mounted() {
	//挂载时拿到子组件的组件实例对象进行atguigu事件及回调的绑定
	this.$refs.student.$on('atguigu',this.demo)

    // setTimeout(()=>{
    // 	this.$refs.student.$on('atguigu',this.demo)
    // }, 3000)
}

<!--子组件-->
<button type="button" @click="sendStudentNameToApp">传递数据给父组件</button>

methods:{
  sendStudentNameToApp(){
	//通过vc.$emit触发绑定的atguigu事件并进行传参
  	this.$emit('atguigu',this.name,'a',true)
  }
}
  • 自定义事件仅触发一次就不再触发

1)使用@或v-on进行绑定的要使用事件修饰符once

<Student @atguigu.once="demo"/>

2)使用ref进行绑定的要使用this.$refs.student.$once()

this.$refs.student.$once('atguigu',this.demo)
  • 自定义事件触发时传递了多个参数,回调函数中如何接收?

1)自定义事件触发时有多少个参数就传多少个参数,回调函数中按相同的数量进行接收【基本不用】

2)将自定义事件触发时传递的参数封装为一个对象

3)回调函数中使用 demo(name, ...params) 进行接收,name为收到的第一个参数,其余所有参数封装到params中,params是一个数组【ES6语法】

注:params并不是固定的参数名,其他任何名字都可,只不过常用该名字

2. 给组件实例对象解绑自定义事件

如果一个组件实例对象身上的某个自定义事件不再用了,可以进行解绑

  • 如何解绑自定义事件

原则:给谁绑的事件,就找谁解绑事件

解绑自定义事件

methods:{
	sendStudentNameToApp(){
		this.$emit('atguigu',this.name,'a',true)
	},
	unbind(){
      	 this.$off('atguigu') //解绑一个自定义事件
         this.$off(['atguigu','demo']) //解绑多个自定义事件
         this.$off() //解绑所有的自定义事件
	}
}

回调函数:只要某个事件被触发了,就会调用指定的函数

vm和vc都能用生命周期钩子

一个组件如果被销毁了,那么该组件身上的所有自定义事件也就失效了

如果vm被销毁了,那么vm的所有子组件也就都销毁了,因此子组件身上的所有自定义事件也就失效了

遇到一个问题:

销毁组件实例对象vc或vm后,原生DOM事件也不能用了

3. 两个注意点

computed中可以使用props接收到的数据

使用ref绑定自定义事件时,能不能直接将自定义事件回调函数的定义写在this.$refs.student.$on方法的参数上

​ 谁触发的事件【this.$emit()在哪个组件中调用的】,事件的回调函数当中的this就是谁

组件除了使用自定义事件以外,能不能使用原生DOM事件?

​ 组件标签默认标注的事件名都是自定义事件,哪怕标注的事件名与原生DOM事件相同,Vue也认为是自定义事件;通过native修饰符【译为原生的】可以让组件标签使用原生DOM事件,使用native修饰符后,事件就相当于绑定在了组件的最外层元素上

<!--App组件-->
<Student ref="student" @click.native="m1"/>

methods:{
  m1(){
  	console.log('m1被调用了')
  }
}

<!--Student组件-->
<!--相当于click事件绑定在了最外层的div上-->
<template>
	<div class="student">
		<h2>学生姓名:{{name}}</h2>
		<h2>学生性别:{{sex}}</h2>
		<h2>当前number的值:{{number}}</h2>
		<button type="button" @click="changeNumber">number的值++</button>
		<button type="button" @click="sendStudentNameToApp">传递数据给父组件</button>
		<button type="button" @click="unbind">解绑事件</button>
		<button type="button" @click="death">销毁Student组件实例对象</button>
	</div>
</template>

4. 总结

  1. 一种组件间通信的方式,适用于:子组件 ===> 父组件

    在父组件中给子组件绑定了自定义事件,子组件去触发自定义事件

  2. 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。

  3. 绑定自定义事件:

    1. 第一种方式,在父组件中:<Demo @atguigu="test"/><Demo v-on:atguigu="test"/>

    2. 第二种方式,在父组件中:

      <Demo ref="demo"/>
      ......
      mounted(){
         this.$refs.xxx.$on('atguigu',this.test)
      }
      
    3. 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法。

      1. 触发自定义事件:this.$emit('atguigu',数据)
  4. 解绑自定义事件this.$off('atguigu')

  5. 组件上也可以绑定原生DOM事件,需要使用native修饰符。

  6. 注意:通过this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

全局事件总线是基于自定义事件的

借助Vue开发者工具,可以查看自定义事件

只要有事件被触发时,下面的界面就会有事件的详细信息

注:source项实际就是指组件的实例对象,如果是<Root>组件就是vm

父亲给儿子一个函数,是要儿子调用的

标签:触发,Vue,CLI,自定义,绑定,事件,atguigu,组件
From: https://www.cnblogs.com/wzzzj/p/18039997

相关文章

  • Vue CLI 系列之(十五)过渡与动画
    过渡与动画Vue封装的过渡与动画1.前置知识CSS3动画【2D转换、3D转换、过渡、动画】参考网站:https://www.runoob.com/css3/css3-animations.html<h1v-show="isShow"id="title">显示了</h1><style> h1{ /*通过animation把"donghua"动画捆绑到h1元素,时长:1......
  • Vue 2x 系列之(十五)过滤器
    过滤器BootCDN:包含了一些免费、优秀的第三方类库官网:https://www.bootcdn.cn/moment.js:js的日期处理类库dayjs:moment.js的轻量化解决方案,API同moment.js完全一致引入dayjs,全局就多了一个dayjs()函数,dayjs()函数默认解析当前时间的时间戳,也可传入时间戳进行解析注:过滤器相对......
  • Vue 2x 系列之(十七)自定义指令
    自定义指令从某种程度上来说,Vue中的自定义指令就是把原生DOM操作进行了一次封装指令是不能脱离元素【标签】存在的定义指令:big使用指令:v-big值的写法:对象【可以处理一些细节上的问题】和函数定义指令可以通过两种方式,函数式和对象式1.函数式指令名(真实DOM元素[element],......
  • Vue 2x 系列之(十六)内置指令
    内置指令我们学过的指令: v-bind :单向绑定解析表达式,可简写为:xxx v-model :双向数据绑定 v-for :遍历数组/对象/字符串 v-on :绑定事件监听,可简写为@ v-if :条件渲染(动态控制节点是否存存在) v-else :条件渲染(动态控制节点是否存存在) v-show :......
  • Vue 2x 系列之(十九)Vue组件化编程
    Vue组件化编程一、对组件的理解什么是组件?组件的定义:​ 实现应用中局部【组件要拆的尽量细致】功能代码【对于前端来说,就是css+html+js】和资源【mp3、mp4、ttf、.zip...】的集合【组件是一个集合】与传统方式编程相比,组件化编程有什么优势?依赖关系不混乱、好维护、代码......
  • Vue 2x 系列之(十八)生命周期
    生命周期[函数]......
  • Vue 2x 系列之(二十)一些注意点
    一些注意点vue基础vue-cli:工程化开发vue-router:在Vue中实现前端路由vuex:应用足够复杂时,用于保管数据element-uivue3Angular==》React==》Vue生命周期函数中的this都是vm开发中自行向vm身上追加属性时【场景:比如methods中要访问mounted钩子中的变量】,避免追加敏感......
  • Vue2.x生命周期函数
    介绍Vue.js2.x中的生命周期函数是一系列钩子函数,它们允许你在Vue实例的不同阶段执行代码。这些生命周期钩子函数允许你在特定的阶段添加自定义逻辑,以便在应用程序生命周期的不同点执行操作。创建阶段1)beforeCreate(创建前):在Vue实例初始化之后,数据观测(dataobs......
  • Vue中组件和插件有什么区别?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、组件是什么回顾以前对组件的定义:组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式,在Vue中每一个.vue文件都可以视为一个组件组件的优势降低整个系统的耦合度,在保持接口不变的......
  • jsp自定义标签
    一、自定义标签的作用自定义标签主要用于移除Jsp页面中的java代码。二、自定义标签开发和使用2.1、自定义标签开发步骤1、编写一个实现Tag接口的Java类(标签处理器类)1packageme.gacl.web.tag;23importjava.io.IOException;45importjavax.servl......