參考一:
vue @click.native 原生點擊事件:
1,給vue組件綁定事件時候,必須加上native ,不然不會生效(監聽根元素的原生事件,使用 .native
修飾符)
2,等同於在自組件中:
子組件內部處理click事件然后向外發送click事件:$emit("click".fn)
參考二:
在事件處理器中經常需要調用 event.preventDefault() 或 event.stopPropagation()。盡管我們在方法內可以輕松做到,不過讓方法是純粹的數據邏輯而不處理 DOM 事件細節會更好。
為了解決這個問題,Vue.js 為 v-on 提供兩個 事件修飾符:.prevent 與 .stop。你是否還記得修飾符是點號打頭的指令后綴?
<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符可以串聯 -->
<a v-on:click.stop.prevent="doThat">
<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>
參考三:
<!-- 阻止單擊事件繼續傳播 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符可以串聯 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件監聽器時使用事件捕獲模式 -->
<!-- 即元素自身觸發的事件先在此處理,然后才交由內部元素進行處理 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只當在 event.target 是當前元素自身時觸發處理函數 -->
<!-- 即事件不是從內部元素觸發的 -->
<div v-on:click.self="doThat">...</div>
使用修飾符時,順序很重要;相應的代碼會以同樣的順序產生。因此,
用 v-on:click.prevent.self
會阻止所有的點擊,
而 v-on:click.self.prevent
只會阻止對元素自身的點擊
-
<!-- 點擊事件將只會觸發一次 -->
-
<a v-on:click.once="doThis"></a>
不像其它只能對原生的 DOM 事件起作用的修飾符,.once
修飾符還能被用到自定義的組件事件上。如果你還沒有閱讀關於組件的文檔,現在大可不必擔心。
Vue 還對應 addEventListener
中的 passive
選項提供了 .passive
修飾符。
-
<!-- 滾動事件的默認行為 (即滾動行為) 將會立即觸發 -->
-
<!-- 而不會等待 `onScroll` 完成 -->
-
<!-- 這其中包含 `event.preventDefault()` 的情況 -->
-
<div v-on:scroll.passive="onScroll">...</div>
這個 .passive
修飾符尤其能夠提升移動端的性能。
不要把 .passive
和 .prevent
一起使用,因為 .prevent
將會被忽略,同時瀏覽器可能會向你展示一個警告。請記住,.passive
會告訴瀏覽器你不想阻止事件的默認行為。
參考四:
關於路由的跳轉,如果我們直接頁面使用a標簽,當然無可厚非;
但是既然是vue單頁面,那么我們就應該能使用vue自帶的組件,那就盡量去熟練它們。
頁面交互
-
<router-link to="/" @click.native.prevent="clickTag">
-
test has native router-link
-
</router-link>
-
//在上面那種情況下,路由會跳轉到首頁,並且控制台也會打印出
-
-
<router-link to="/" @click="clickTag">
-
test no native router-link
-
</router-link>
-
//在上面那種情況下,路由只會跳轉到首頁,控制台毫無反應
-
//ps:@mouseover、@mouseout等等事件都如此
-
<script>
-
export default {
-
methods: {
-
clickTag() {
-
console.log('i am click in father.vue')
-
}
-
}
-
}
-
</script>
上面那種是vue自帶的組件情況,如果是自定義組件的話,native修飾符在我眼里,起到了節約代碼的作用。
父組件
-
<svg-icon icon- class="user" @click="svgClickTag"></svg-icon>
-
//js methods部分
-
svgClickTag() {
-
console.log( 'svg-icon click in father.vue')
-
}
子組件:要想實現父組件內的點擊事件,子組件必須監聽點擊並觸發父組件定義的click
-
<svg : class="svgClass" aria-hidden="true" @click="clickSvgComponent">
-
<use :xlink:href= "iconName"></use>
-
</svg>
-
//js methods部分
-
clickSvgComponent() {
-
this.$emit('click')
-
}
如果有了native修飾符,那就沒有子組件什么事情了
-
//子組件照常寫,不作任何事件綁定,刪掉methods
-
<svg : class="svgClass" aria-hidden="true">
-
<use :xlink:href= "iconName"></use>
-
</svg>
-
-
//父組件
-
<svg-icon icon- class="user" @click.native="svgClickTag"></svg-icon>
針對vue-element-ui中的el-button
-
<el-button type= "primary" style="width: 100%;" :loading="loading"
-
-
//個人認為這個庫已經這某些地方把原生的click做了處理了,因為嘗試過去掉native,照常成功
總結:native就是把組件變回原生DOM的一種方式,相當於給組件綁定原生事件。
轉自:https://blog.csdn.net/weixin_41646716/article/details/90069562