Vue事件修飾符native、self示例詳解
事出有因
之前面試被問(wèn)到的native和self相關(guān)問(wèn)題,self我覺(jué)得自己應(yīng)該能回答出來(lái),可能被之前一小時(shí)的問(wèn)題整懵逼了。尷尬~~
自己研究了一下,不足之處望補(bǔ)充,相互進(jìn)步
native
修飾符native,有什么用
- native是原生事件(第一反應(yīng),當(dāng)時(shí)沒(méi)然后了...)
惡補(bǔ)一下
- native 一定是用于自定義組件,也就是自定義的html標(biāo)簽
結(jié)合代碼說(shuō)得明白
<body>
<div id="app">
<div class="box" >
<Son @click='handler1'></Son>
</div>
</div>
</body>
<script>
const Son = Vue.component('Son', {
template: '<button @mouseover=handler2 class="box1">son</button>',
methods: {
handler2 (e) {
}
}
})
new Vue({
el: "#app",
components: {
Son
},
data() {
return {
a: 123
}
},
methods: {
handler1 (e) {
console.log('父級(jí)')
}
}
})
</script>
注意點(diǎn)
- 當(dāng)<Son @click='handler1'></Son>,子組件中的this.$listeners返回的是{click: ƒ},box1的dom上沒(méi)有綁定click事件(可以打開(kāi)F12查看),所以這個(gè)事件不是原生的click
- 當(dāng)<Son @click.native='handler1'></Son>,子組件中的this.$listeners返回的是{},box1的dom上綁定了click事件(可以打開(kāi)F12查看),所以這個(gè)事件是原生的click
- 當(dāng)<Son @click.self='handler1'></Son>,子組件中的this.$listeners返回的是{click: ƒ},box1的dom上沒(méi)有綁定click事件(可以打開(kāi)F12查看),所以這個(gè)事件不是原生的click
- 子組件的this.$emit('eventTpye')是從this.$listeners返回值中查找的
為什么有時(shí)候組件點(diǎn)擊事件不會(huì)生效
猜測(cè)
- 子組件html標(biāo)簽沒(méi)有定義click原生事件
- 子組件沒(méi)有執(zhí)行this.$emit('click')
所以
直接.native將事件綁定到子組件html標(biāo)簽上,類(lèi)似dom.addEventListener('click', handler)
self
作用
引用官方說(shuō)明
<!-- 只當(dāng)在 event.target 是當(dāng)前元素自身時(shí)觸發(fā)處理函數(shù) --> <!-- 即事件不是從內(nèi)部元素觸發(fā)的 --> <div v-on:click.self="doThat">...</div>
結(jié)合代碼說(shuō)明
<body>
<div id="app">
<div class="box" @click.self='handler1'>
<Son ></Son>
</div>
</div>
</body>
<script>
const Son = Vue.component('Son', {
template: '<button @click=handler2 class="box1">son</button>',
methods: {
handler2 (e) {
console.log(e.target, e.currentTarget)
}
}
})
new Vue({
el: "#app",
components: {
Son
},
data() {
return {
a: 123
}
},
methods: {
handler1 (e) {
console.log(e.target, e.currentTarget)
}
}
})
</script>
就是利用e.target和e.currentTarget,當(dāng)添加self時(shí),只有當(dāng)兩者相等時(shí)才會(huì)觸發(fā)回調(diào)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
解決Vue數(shù)據(jù)更新了但頁(yè)面沒(méi)有更新的問(wèn)題
在vue項(xiàng)目中,有些我們會(huì)遇到修改完數(shù)據(jù),但是視圖卻沒(méi)有更新的情況,具體的場(chǎng)景不一樣,解決問(wèn)題的方法也不一樣,在網(wǎng)上看了很多文章,在此總結(jié)匯總一下,需要的朋友可以參考下2023-08-08
vue.js項(xiàng)目打包上線(xiàn)的圖文教程
下面小編就為大家分享一篇vue.js項(xiàng)目打包上線(xiàn)的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
基于vite2+Vue3編寫(xiě)一個(gè)在線(xiàn)幫助文檔工具
提起幫助文檔,想必大家都會(huì)想到?VuePress等。但是VuePress是“靜態(tài)網(wǎng)站生成器”,需要我們自行編寫(xiě)文檔,然后交給VuePress變成網(wǎng)站。因此,本文將用vite2+Vue3編寫(xiě)一個(gè)在線(xiàn)幫助文檔工具,需要的可以參考一下2022-03-03
Vite+Electron快速構(gòu)建VUE3桌面應(yīng)用的實(shí)現(xiàn)
本文主要介紹了Vite+Electron快速構(gòu)建VUE3桌面應(yīng)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Vue異步更新DOM及$nextTick執(zhí)行機(jī)制解讀
這篇文章主要介紹了Vue異步更新DOM及$nextTick執(zhí)行機(jī)制解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
打通前后端構(gòu)建一個(gè)Vue+Express的開(kāi)發(fā)環(huán)境
這篇文章主要介紹了打通前后端構(gòu)建一個(gè)Vue+Express的開(kāi)發(fā)環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
vue-router之實(shí)現(xiàn)導(dǎo)航切換過(guò)渡動(dòng)畫(huà)效果
今天小編就為大家分享一篇vue-router之實(shí)現(xiàn)導(dǎo)航切換過(guò)渡動(dòng)畫(huà)效果,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
淺談在不使用ssr的情況下解決Vue單頁(yè)面SEO問(wèn)題(2)
這篇文章主要介紹了淺談在不使用ssr的情況下解決Vue單頁(yè)面SEO問(wèn)題(2),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
使用Vite構(gòu)建Vue3項(xiàng)目的流程步驟
在現(xiàn)代前端開(kāi)發(fā)的世界中,Vue 3 已然成為了一個(gè)備受喜愛(ài)的框架,而 Vite 作為一個(gè)新興的構(gòu)建工具,以其極高的效率和簡(jiǎn)捷的配置方式席卷了開(kāi)發(fā)者圈,本文我們將一步一步展示如何使用 Vite 構(gòu)建一個(gè) Vue 3 項(xiàng)目,從創(chuàng)建項(xiàng)目到最后的構(gòu)建階段,需要的朋友可以參考下2024-07-07

