vue-learning:27 - component - 组件三大API之二:event
2021-05-30 21:24
标签:end alert self strong htm value this cti query 在上一节中讲到prop单向下行数据绑定的特征,父组件向子组件传值通过prop实现,那如果有子组件需要向父组件传值或其它通信请求,可以通过 点击查看:v-on事件及事件修饰符,以及DOM/JQUERY事件对比 所以要实现上面子组件向父组件通信,我们可以在父组件中将 点击DEMO查看示例 this is event example for v-on/@
事件名称始终采用kebab-case形式 事件传参 this is event example for $on
对于组件内部触发有条件下其它事件时,比如就监听执行一次用 上面使用 上面的例子修改下,使用 this is event example for $on / $emit / $refs
移除自定义事件监听器。 this is event example for $off
包含了父作用域中的在组件标签上所有通过v-on注册的事件监听器。 下面的例子,我们在子组件标签上绑定了一个原生事件,二个 this is event example for $listeners
vue-learning:27 - component - 组件三大API之二:event 标签:end alert self strong htm value this cti query 原文地址:https://www.cnblogs.com/webxu20180730/p/11031243.html组件三大API之二: event
vue
的事件监听系统(触发事件,执行监听回调函数,并且可以在回调函数中接受传参)。Vue
内置了一套完整的事件触发器逻辑:
v-on / @
: 原来HTML元素中监听原生事件,或子组件自定义事件.native
: 触发组件根元素的原生事件$on
:监听组件自身触发的事件$emit
: 触发事件$off
: 卸载组件自身的事件监听器$once
: 单次监听,只会执行一次事件监听,之后不再有效$listeners
: 包含在组件标签上v-on注册的所有自定义监听器的对象,key为事件名,value为事件监听函数。v-on / @
v-on
绑定在子组件标签上开启一个事件监听,然后在子组件内部使用$emit
触发该事件。const comChild = Vue.extend({
template: ``,
methods: {
handleClick() {
this.$emit('com-btn-click',666)
}
}
})
const vm = new Vue({
el: "#app",
components: {
comChild,
},
methods: {
handleChildClick(val) {
alert('我是由子组件触发的:' + val);
}
}
})
不同于组件和 prop,事件名不会作为一个 JavaScript 变量名或属性名,所以不存在任何自动化的大小写转换。即触发的事件名需要完全匹配监听这个事件所用的名称。
又因为v-on绑定在html元素上,而 HTML 是不区分大小写的。而一般事件名称都是采用多个单词,所以建议事件名一律采用kebab-case
连字符形式。
子组件在$emit
触发事件的同时,可以传递一个值,在v-on
绑定的事件监听器中接收到。// $emit第一个参数是监听器事件名,第二个是要传递的参数
this.$emit('some-event',666)
// 监听事件处理函数第一个参数即为接收的值
handleChildEvent(val) {
alert('我是由子组件触发的:' + val)
}
$on / $once
$on
开启的监听事件和$emit
触发的监听事件都是在同一个组件实例。const comChild = Vue.extend({
template: ``,
data: () => {
return {
count: 0,
}
},
methods: {
handleClick() {
this.count++
this.$emit('comBtnClick',this.count)
}
},
mounted() {
this.$on('comBtnClick', (val) => {
alert('我是由$on注册的监听子组件按钮点击事件'+val)
if (val === 3) {
console.log('卸载事件监听')
this.$off('comBtnClick')
}
})
this.$once('comBtnClick', (val) => {
alert('我是由$once注册监听子组件按钮点击事件,只会触发一次'+val)
})
}
})
const vm = new Vue({
el: "#app",
components: {
comChild,
},
})
$once
,或监听执行然后某条件满足下不再监听用$on配合$off
。
但是如果是持续监听,只要事件触发就执行某动作,完全可以将监听回调函数写成methods中方法,事件处理时直接执行该方法。const comChild = Vue.extend({
template: ``,
methods: {
handleClick() {
// this.$emit('comBtnClick',888)
this.comBtnClick(val)
},
comBtnClick(val) {
alert('我是按钮点击触发执行'+val)
}
},
})
$on / $emit
如果只在组件内部执行,并不能实现子组件向父组件传值通信的目的。此时我们需要再配合$refs
属性实现。
ref
特性用在单个HTML
元素上可以获取原生DOM
节点对象,用在组件标签上,可以获取该组件实例对象。$on / $emit / $refs
实例子组件向父组件组件的目的const comChild = Vue.extend({
template: `
$off
const comChild = Vue.extend({
template: `
$listeners
但不包括:
v-on
方式的自定义事件,一个$on
方式的自定义事件。
但终$listeners
打印出来的只有其中二个v-on
方式绑定的事件。const comChild = Vue.extend({
template: `
$listeners:
child-btn-click-alert: ? invoker()
child-btn-click-console: ? invoker()
文章标题:vue-learning:27 - component - 组件三大API之二:event
文章链接:http://soscw.com/index.php/essay/89695.html