Vue組件中的自定義事件你瞭解多少

主要介紹組件的自定義事件的概念,使用等。

何為組件自定義事件:

  • 組件自定義事件是一種組件間的通信方式,方向是 子組件====>父組件。
  • 使用場景:A是子組件,B是父組件,如果要把B的數據傳給A,可以使用props配置項,如果要把A的數據轉給B,就要用到組件自定義事件或者使用props加回調函數也可實現。

先使用props加回調函數實現子組件傳遞數據給父組件。

在這裡插入圖片描述

main.js:

//引入vue依賴
import Vue from 'vue'
//引入組件App
import App from './App.vue'
// 關閉生產提示
Vue.config.productionTip = false
//創建一個vue實例
new Vue({
  //這個目前還沒學過,先知道他的作用是將app放入容器中。
  render: h => h(App),
  //配置該vue實例管理id為app的容器
}).$mount('#app')

App.vue:

<template>
    <!-- 編寫結構 -->
    <div>
        <!-- 傳遞回調函數給子組件School -->
        <school :getSchoolNameFromSchoolVc="getSchoolNameFromSchoolVc"></school>
    <hr>
    <student></student>
    <div>App獲取School子組件的學校名:{{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:{
        //定義一個回調函數並傳遞給子組件School
        getSchoolNameFromSchoolVc(schoolName){
            console.log("App獲取School子組件的學校名:",schoolName);
            //賦值給schoolNameFromSchool
            this.schoolNameFromSchool = schoolName;
        }
    }
}
</script>
<style>
</style>

schoo.vue:

<template>
    <!-- 編寫組件結構代碼,也就是html代碼 -->
    <!-- 需要一個div括住,也就是隻能有一個根元素,一般使用div -->
    <div class="orange">
        <div>學校:{{schoolName}}</div>
        <div>地址:{{schoolAddress}}</div>
        <!-- //定義一個按鈕,點擊傳遞學校名稱給App組件。 -->
        <button @click="sendSchoolNameToApp">傳遞學校名給App組件</button>
    </div>
</template>
<script>
//交互代碼編寫的地方,需要暴露出去給其他地方引入
//這個需要有一點es6模塊化的知識,這裡一般使用默認暴露,因為這是單文件組件,隻需要暴露一個組件對象,
//並且引入默認暴露的組件引入語法比較簡單。
export default {
    data() {
        return {
        schoolName:"尚矽谷",
        schoolAddress:"北京"
        }
    },
    //接收回調函數
    props:["getSchoolNameFromSchoolVc"],
    methods:{
       sendSchoolNameToApp(){
           //調用回調函數,並把學校名傳遞進去
           this.getSchoolNameFromSchoolVc(this.schoolName)
       }     
    }
}
</script>
<style scoped>
    /* 編寫樣式的地方 */
    .orange{
        background-color: orange;
    }
</style>

student.vue:

<template>
    <!-- 編寫組件結構代碼,也就是html代碼 -->
    <!-- 需要一個div括住,也就是隻能有一個根元素,一般使用div -->
    <div class="orange">
        <div>學生姓名:{{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)中定義一個回調方法並傳遞給子組件(School)。

在這裡插入圖片描述

在這裡插入圖片描述

該回調方法是把School組件傳遞過來的學校名渲染在App組件對應的區域。

2.子組件使用props配置項接收回調函數,並且編寫一個按鈕,點擊就調用該回調函數把數據傳遞到App組件中。

在這裡插入圖片描述

在這裡插入圖片描述

效果:

在這裡插入圖片描述

在這裡插入圖片描述

第二種方式是使用組件自定義事件實現:

使用組件自定義事件實現把子組件Student的學生名傳遞到App組件,並進行渲染。

分一下步驟:

3. 在父組件App中,設置自定義事件,並配置一個事件回調

在這裡插入圖片描述

在這裡插入圖片描述

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

在這裡插入圖片描述

在這裡插入圖片描述

效果:

在這裡插入圖片描述

除瞭在組件標簽中綁定自定義事件,也可以配合ref屬性在生命周期回調函數$mounted中進行綁定。

在這裡插入圖片描述

在這裡插入圖片描述

執行效果一樣的。

自定義事件照樣可以使用事件修飾符once。

在這裡插入圖片描述

在這裡插入圖片描述

使用props或者組件自定義事件進行子組件像父組件傳遞數據的方式是比較像的。

props的方式是直接把回調函數傳遞給子組件調用。

而組件自定義事件是把回調函數通過事件的方式暴露出去,然後子組件通過觸發事件,達到調用回調函數的效果。

解綁組件自定義事件:

在這裡插入圖片描述

或者組件被銷毀時,這些自定義事件會被銷毀。

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!      

推薦閱讀: