以前面試被問到的native和self相關問題,self我以爲本身應該能回答出來,可能被以前一小時的問題整懵逼了。尷尬~~
本身研究了一下,不足之處望補充,相互進步html
native
,有什麼用native
是原生事件(第一反應,當時沒而後了...)惡補一下面試
native
必定是用於自定義組件,也就是自定義的html
標籤<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('父級') } } }) </script>
注意點app
<Son @click='handler1'></Son>
,子組件中的this.$listeners
返回的是{click: ƒ}
,box1的dom上沒有綁定click事件(能夠打開F12查看),因此這個事件不是原生的click
<Son @click.native='handler1'></Son>
,子組件中的this.$listeners
返回的是{}
,box1的dom上綁定了click事件(能夠打開F12查看),因此這個事件是原生的click
<Son @click.self='handler1'></Son>
,子組件中的this.$listeners
返回的是{click: ƒ}
,box1的dom上沒有綁定click事件(能夠打開F12查看),因此這個事件不是原生的click
this.$emit('eventTpye')
是從this.$listeners
返回值中查找的爲何有時候組件點擊事件不會生效
猜想dom
html
標籤沒有定義click
原生事件this.$emit('click')
因此函數
.native
將事件綁定到子組件html
標籤上,相似dom.addEventListener('click', handler)
引用官方說明this
<!-- 只當在 event.target 是當前元素自身時觸發處理函數 --> <!-- 即事件不是從內部元素觸發的 --> <div v-on:click.self="doThat">...</div>
結合代碼說明code
<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
,當添加self
時,只有當二者相等時纔會觸發回調