Vue組件中的自定義事件你了解多少
主要介紹組件的自定義事件的概念,使用等。
何為組件自定義事件:
- 組件自定義事件是一種組件間的通信方式,方向是 子組件====>父組件。
- 使用場景:A是子組件,B是父組件,如果要把B的數(shù)據(jù)傳給A,可以使用props配置項,如果要把A的數(shù)據(jù)轉(zhuǎn)給B,就要用到組件自定義事件或者使用props加回調(diào)函數(shù)也可實現(xiàn)。
先使用props加回調(diào)函數(shù)實現(xiàn)子組件傳遞數(shù)據(jù)給父組件。

main.js:
//引入vue依賴
import Vue from 'vue'
//引入組件App
import App from './App.vue'
// 關(guān)閉生產(chǎn)提示
Vue.config.productionTip = false
//創(chuàng)建一個vue實例
new Vue({
//這個目前還沒學(xué)過,先知道他的作用是將app放入容器中。
render: h => h(App),
//配置該vue實例管理id為app的容器
}).$mount('#app')
App.vue:
<template>
<!-- 編寫結(jié)構(gòu) -->
<div>
<!-- 傳遞回調(diào)函數(shù)給子組件School -->
<school :getSchoolNameFromSchoolVc="getSchoolNameFromSchoolVc"></school>
<hr>
<student></student>
<div>App獲取School子組件的學(xué)校名:{{schoolNameFromSchool}}</div>
</div>
</template>
<script>
// 原本的引入
// import school from "./School.vue"
// import student from "./Student.vue"
//修改后的
//引入school組件和student組件,涉及es模塊化的語法
import school from "./components/School.vue"
import student from "./components/Student.vue"
export default {
data() {
return {
schoolNameFromSchool:""
}
},
components:{
//注冊組件
school,
student
},
methods:{
//定義一個回調(diào)函數(shù)并傳遞給子組件School
getSchoolNameFromSchoolVc(schoolName){
console.log("App獲取School子組件的學(xué)校名:",schoolName);
//賦值給schoolNameFromSchool
this.schoolNameFromSchool = schoolName;
}
}
}
</script>
<style>
</style>
schoo.vue:
<template>
<!-- 編寫組件結(jié)構(gòu)代碼,也就是html代碼 -->
<!-- 需要一個div括住,也就是只能有一個根元素,一般使用div -->
<div class="orange">
<div>學(xué)校:{{schoolName}}</div>
<div>地址:{{schoolAddress}}</div>
<!-- //定義一個按鈕,點擊傳遞學(xué)校名稱給App組件。 -->
<button @click="sendSchoolNameToApp">傳遞學(xué)校名給App組件</button>
</div>
</template>
<script>
//交互代碼編寫的地方,需要暴露出去給其他地方引入
//這個需要有一點es6模塊化的知識,這里一般使用默認暴露,因為這是單文件組件,只需要暴露一個組件對象,
//并且引入默認暴露的組件引入語法比較簡單。
export default {
data() {
return {
schoolName:"尚硅谷",
schoolAddress:"北京"
}
},
//接收回調(diào)函數(shù)
props:["getSchoolNameFromSchoolVc"],
methods:{
sendSchoolNameToApp(){
//調(diào)用回調(diào)函數(shù),并把學(xué)校名傳遞進去
this.getSchoolNameFromSchoolVc(this.schoolName)
}
}
}
</script>
<style scoped>
/* 編寫樣式的地方 */
.orange{
background-color: orange;
}
</style>
student.vue:
<template>
<!-- 編寫組件結(jié)構(gòu)代碼,也就是html代碼 -->
<!-- 需要一個div括住,也就是只能有一個根元素,一般使用div -->
<div class="orange">
<div>學(xué)生姓名:{{studentName}}</div>
<div>年齡:{{studentAge}}</div>
</div>
</template>
<script>
//交互代碼編寫的地方,需要暴露出去給其他地方引入
//這個需要有一點es6模塊化的知識,這里一般使用默認暴露,因為這是單文件組件,只需要暴露一個組件對象,
//并且引入默認暴露的組件引入語法比較簡單。
export default {
data() {
return {
studentName:"張三",
studentAge:18
}
},
}
</script>
<style>
/* 編寫樣式的地方 */
.orange{
background-color: gray;
}
</style>
這種方式的流程:
1.在父組件(App)中定義一個回調(diào)方法并傳遞給子組件(School)。


該回調(diào)方法是把School組件傳遞過來的學(xué)校名渲染在App組件對應(yīng)的區(qū)域。
2.子組件使用props配置項接收回調(diào)函數(shù),并且編寫一個按鈕,點擊就調(diào)用該回調(diào)函數(shù)把數(shù)據(jù)傳遞到App組件中。


效果:


第二種方式是使用組件自定義事件實現(xiàn):
使用組件自定義事件實現(xiàn)把子組件Student的學(xué)生名傳遞到App組件,并進行渲染。
分一下步驟:
3. 在父組件App中,設(shè)置自定義事件,并配置一個事件回調(diào)


4. 在子組件中,觸發(fā)自定義事件,把值傳過去。


效果:

除了在組件標(biāo)簽中綁定自定義事件,也可以配合ref屬性在生命周期回調(diào)函數(shù)$mounted中進行綁定。


執(zhí)行效果一樣的。
自定義事件照樣可以使用事件修飾符once。


使用props或者組件自定義事件進行子組件像父組件傳遞數(shù)據(jù)的方式是比較像的。
props的方式是直接把回調(diào)函數(shù)傳遞給子組件調(diào)用。
而組件自定義事件是把回調(diào)函數(shù)通過事件的方式暴露出去,然后子組件通過觸發(fā)事件,達到調(diào)用回調(diào)函數(shù)的效果。
解綁組件自定義事件:

或者組件被銷毀時,這些自定義事件會被銷毀。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Vue腳手架配置代理服務(wù)器的兩種方式(小結(jié))
本文主要介紹了Vue腳手架配置代理服務(wù)器的兩種方式(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
vue中Element-ui 輸入銀行賬號每四位加一個空格的實現(xiàn)代碼
我們在輸入銀行賬號會設(shè)置每四位添加一個空格,輸入金額,每三位添加一個空格。那么,在vue,element-ui 組件中,如何實現(xiàn)呢?下面小編給大家?guī)砹藇ue中Element-ui 輸入銀行賬號每四位加一個空格的實現(xiàn)代碼,感興趣的朋友一起看看吧2018-09-09
Vue項目引入translate.js國際化自動翻譯組件的方法
這篇文章主要給大家介紹了關(guān)于Vue項目引入translate.js國際化自動翻譯組件的相關(guān)資料,除了基本的文本翻譯功能之外,jstranslate還提供了一些高級功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01
vue.nextTick()與setTimeout的區(qū)別及說明
這篇文章主要介紹了vue.nextTick()與setTimeout的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

