亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3中父子組件之間相互通信的方式詳解

 更新時間:2025年01月09日 09:38:04   作者:Danta  
本文主要探討了 Vue 3 中父子組件之間的通信方式,包括父傳子,通過props傳遞數(shù)據(jù)和方法;子傳父,用emit觸發(fā)自定義事件并傳遞數(shù)據(jù);還介紹了使用ref直接操作子組件實例,借助defineExpose暴露子組件的屬性和方法給父組件,需要的朋友可以參考下

前言

父子組件通信,作為Vue應用開發(fā)中不可或缺的一部分,是實現(xiàn)數(shù)據(jù)流動、事件觸發(fā)以及組件間互動的關鍵機制。無論是簡單的屬性傳遞,還是復雜的交互邏輯,掌握這一技能對于構建富有層次感和互動性的用戶界面至關重要。通過學習如何有效地利用props進行數(shù)據(jù)下行傳遞,使用emit觸發(fā)自定義事件,以及借助ref直接操作子組件。本文將詳細探討Vue 3中的父子組件通信,幫助你深入了解并掌握這些核心概念。

父傳子

使用Props傳遞數(shù)據(jù)和方法

在Vue中,父組件向子組件傳遞數(shù)據(jù)最常用的方法是通過props。props允許父組件以一種聲明式的方式向下傳遞數(shù)據(jù)到子組件。這種方式不僅簡化了數(shù)據(jù)流的管理,還確保了組件之間的單向數(shù)據(jù)綁定,使得狀態(tài)更易于追蹤和調試。

代碼模塊

App.vue

<script setup>
import ChildComponent from './components/ChildComponent.vue'
import { ref } from 'vue'
const title=ref("來自父組件的消息")
const method =()=>{
    console.log("來自父組件的方法")
}
</script>

<template>
   <div>
   
      <h2>父組件</h2>
       <ChildComponent :title="title" :parentmethod="method" />
   </div>
</template>

<style scoped>

</style>

解析:

  • const title:創(chuàng)建了一個響應式的引用(ref),它的值是“來自父組件的消息”。這個引用可以被傳遞給子組件,并且如果在父組件中修改了它的值,子組件會自動更新。
  • const method:定義了一個簡單的方法,當它被執(zhí)行時,會在瀏覽器的控制臺輸出一條信息。
  • :title="title" 的意思就是:將父組件中的title響應式變量的值綁定到子組件的title prop上。每當父組件中的title發(fā)生變化時,子組件也會自動更新其對應的title prop,并反映出最新的值。:parentmethod="method"同理

ChildComponent.vue

<template>
    <div>
      在子組件中: {{props.title}}
      <button @click="props.parentmethod">子組件調用父組件的方法</button>
    </div>
</template>

<script setup>
import {
    defineProps,
    ref
} from 'vue'
const props=defineProps({
    title:{
        type:String,
        required:true
    },
    parentmethod:{
        type:Function,
        required:true
    }

})
</script>

<style  scoped>

</style>
  • 接收props:子組件通過defineProps聲明了它期望從父組件接收兩個propstitleparentmethod。根據(jù)填寫requiredtrue|flase,是否判斷必需傳入。這兩個props都是必需的,并且有type來定義明確的類型。
  • 顯示props:在模板中,子組件使用{{ props.title }}來顯示父組件傳遞過來的標題。
  • 調用父組件方法:子組件還包含了一個按鈕,其點擊事件被綁定到了props.parentmethod。這意味著當用戶點擊按鈕時,子組件會觸發(fā)父組件中定義的方法。由于parentmethod是從父組件傳入的一個函數(shù)引用,因此它會在父組件的作用域內(nèi)執(zhí)行。
  • 響應性:因為title是一個響應式的prop,如果父組件更新了它的值,子組件也會自動重新渲染以反映最新的標題。

效果:

子傳父

使用Emit觸發(fā)自定義事件

子組件與父組件通信的主要方式之一是通過emit觸發(fā)自定義事件。當子組件想要通知父組件某個特定事件發(fā)生時,它可以調用emit來觸發(fā)一個命名事件,并可以選擇性地傳遞額外的數(shù)據(jù)。 App.vue

<script setup>
import ChildComponent from './components/ChildComponent.vue'
import { ref } from 'vue'
const title=ref("來自父組件的消息")
const method =()=>{
    console.log("來自父組件的方法")
}
const messageFromChild=ref("")
const handleChildMessage = (message) => {
    console.log('來自子組件的消息:', message);
    messageFromChild.value=message
    // 在這里可以處理子組件發(fā)送的消息
};
</script>

<template>
   <div>
       
      <h2>父組件</h2>
       <ChildComponent :title="title" :parentmethod="method"  @child-message="handleChildMessage"/>
       <p>來自子組件的消息:{{messageFromChild}}</p>
   </div>
</template>

<style scoped>

</style>
  • @child-message="handleEvent" 自定義事件名稱 attrs + 處理函數(shù)
    • child-message:這是你為子組件定義的一個自定義事件名稱。它不是內(nèi)置的DOM事件(如clickinput等),而是由開發(fā)者根據(jù)需求命名的。通過這個名稱,子組件可以觸發(fā)特定事件并向父組件傳遞數(shù)據(jù)。
    • handleEvent:這是父組件中定義的一個方法,用來處理來自子組件的消息。當你在父組件模板中使用@child-message="handleEvent"時,實際上是在說:“每當子組件觸發(fā)child-message事件時,請調用handleEvent方法”。

ChildComponent.vue

<template>
    <div>
      在子組件中: {{props.title}}
      <hr>
      <button @click="props.parentmethod">子組件調用父組件的方法</button>
      <hr>
      <button @click="childMessage">子組件給父組件發(fā)送數(shù)據(jù)</button>
    </div>
</template>

<script setup>
import {
    defineProps,
    ref,
    defineEmits,

} from 'vue'
const props=defineProps({
    title:{
        type:String,
        required:true
    },
    parentmethod:{
        type:Function,
        required:true
    }

})
const emit = defineEmits(['child-message'])
const childMessage = () => {
    emit('child-message', '我是子組件');
  };
</script>

<style  scoped>

</style>

解析:

  • const emit = defineEmits(['child-message'])
    • defineEmits:這是Vue Composition API的一部分,用于定義子組件可以觸發(fā)的自定義事件列表。它返回一個函數(shù)emit,該函數(shù)可以用來觸發(fā)這些事件。
    • ['child-message'] :這里是一個字符串數(shù)組,列出了所有可以由子組件觸發(fā)的自定義事件名稱。在這個例子中,我們只定義了一個名為child-message的事件,如果有多個事件,可以通過數(shù)組的形式添加。
  • const childMessage....
    • emit('child-message', '我是子組件') :調用emit函數(shù)來觸發(fā)一個名為child-message的自定義事件,并傳遞一個字符串'我是子組件'作為參數(shù)。這個消息會被發(fā)送給監(jiān)聽了child-message事件的父組件。

效果:

圖解:

當我們實現(xiàn)完子組件向父組件,傳遞信息后,那么長的帥的讀者就要問了?怎么向父組件傳遞方法呢?

使用ref實現(xiàn)子組件對父組件的傳遞

創(chuàng)建響應式引用:

大家都知道ref 可以用來創(chuàng)建一個響應式的變量,該變量可以被綁定到模板中的元素或組件上。當這個變量的值發(fā)生變化時,視圖會自動更新。

  import { ref } from 'vue'
    const count = ref(0)

訪問子組件實例:

當你需要直接與子組件進行交互時(比如調用子組件的方法或訪問它的屬性),可以通過給子組件添加 ref 屬性來獲取子組件的實例。

代碼:

我們可以先看子組件向父組件輸出了什么? parent組件:

<template>
    <div>
      <Child ref="comp" />
      <button @click="handlerClick">按鈕</button>
    </div>
</template>

<script setup>
import { ref } from 'vue'
import Child from './Child.vue'

const comp = ref(null) // 標記DOM 元素  null 組件沒用掛載,DOM 也不在 
const title = ref('hello') // 標記數(shù)據(jù)
const handlerClick = ()=>{
    console.log(comp,comp.value)
   console.log( comp.value.childName)
   comp.value.someMethod()
}

</script>
<style  scoped>
</style>

child組件:

<template>
    <div>
       Child
    </div>
</template>

<script setup>
import {
    defineProps,
    defineEmits,
    defineExpose,
    ref
} from 'vue'
defineExpose({
    childName:"這是子組件的屬性",
    someMethod:()=>{
        console.log('這是子組件的方法')
    }
})
</script>
<style  scoped>

</style>

解析:

  • 重點: <Child ref="comp" />:這里定義了一個子組件Child,并通過ref屬性給它指定了一個名為comp的引用。這使得父組件可以在JavaScript中直接訪問這個子組件實例,調用子組件的方法和屬性。

  • defineExpose({ ... }):這是Vue Composition API的一部分,用來明確哪些屬性或方法應該暴露給父組件。在這個例子中,我們暴露了兩個成員:

    • childName:一個字符串,作為子組件的一個公開屬性。
    • someMethod:一個函數(shù),作為子組件的一個公開方法,可以被父組件調用。
  • 最后在父組件就可以通過 comp.value.,調用方法或者屬性。

運行機制

  • 掛載階段:當父組件首次渲染時,子組件也會一同被掛載。此時,comp.value會被更新為指向子組件的實例。

  • 點擊按鈕:用戶點擊按鈕后,handlerClick函數(shù)被執(zhí)行。由于此時子組件已經(jīng)掛載完成,因此可以通過comp.value訪問到子組件實例,并且可以安全地調用它的公開屬性和方法。

  • 輸出結果

    • 控制臺首先會打印出comp引用及其當前值(即子組件實例)。
    • 接著會打印出子組件的childName屬性值:“這是子組件的屬性”。
    • 最后,調用子組件的someMethod方法,在控制臺上輸出:“這是子組件的方法”。

效果:

總結:

  • 父傳子 - 使用props傳遞數(shù)據(jù)和方法:父組件可以通過props將數(shù)據(jù)和方法傳遞給子組件,這種方式不僅簡化了數(shù)據(jù)流的管理,還確保了組件之間的單向數(shù)據(jù)綁定,使得狀態(tài)更易于追蹤和調試。
  • 子傳父 - 使用emit觸發(fā)自定義事件:子組件可以通過emit觸發(fā)自定義事件來通知父組件某些特定事件的發(fā)生,并可以選擇性地傳遞額外的數(shù)據(jù)。父組件可以通過監(jiān)聽這些事件來做出相應的反應。
  • 使用ref直接操作子組件實例:當需要直接與子組件進行交互時,比如調用子組件的方法或訪問它的屬性,可以通過給子組件添加ref屬性來獲取子組件的實例。借助defineExpose,可以有選擇性地暴露子組件的屬性和方法給父組件。

以上就是Vue3中父子組件之間相互通信的方式詳解的詳細內(nèi)容,更多關于Vue3父子組件通信方式的資料請關注腳本之家其它相關文章!

相關文章

  • Vue3使用dayjs以及dayjs日期工具類詳解

    Vue3使用dayjs以及dayjs日期工具類詳解

    這篇文章主要介紹了Vue3使用dayjs以及dayjs日期工具類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 基于 flexible 的 Vue 組件:Toast -- 顯示框效果

    基于 flexible 的 Vue 組件:Toast -- 顯示框效果

    這篇文章主要介紹了基于 flexible 的 Vue 組件:Toast -- 顯示框效果,需要的朋友可以參考下
    2017-12-12
  • Vue.js實現(xiàn)網(wǎng)格列表布局轉換方法

    Vue.js實現(xiàn)網(wǎng)格列表布局轉換方法

    下面小編就為大家?guī)硪黄猇ue.js實現(xiàn)網(wǎng)格列表布局轉換方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • vue+element+Java實現(xiàn)批量刪除功能

    vue+element+Java實現(xiàn)批量刪除功能

    這篇文章主要介紹了vue+element+Java實現(xiàn)批量刪除功能,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • vue組件通信傳值操作示例

    vue組件通信傳值操作示例

    這篇文章主要介紹了vue組件通信傳值操作,結合實例形式分析了vue.js父子組件通信及兄弟組件通信相關操作技巧,需要的朋友可以參考下
    2019-01-01
  • vue3過渡動畫的詳解

    vue3過渡動畫的詳解

    這篇文章主要為大家詳細介紹了vue3過渡動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Vue前端解析Excel數(shù)據(jù)方式

    Vue前端解析Excel數(shù)據(jù)方式

    這篇文章主要介紹了Vue前端解析Excel數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue 更改連接后臺的api示例

    vue 更改連接后臺的api示例

    今天小編就為大家分享一篇vue 更改連接后臺的api示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • axios請求二次封裝之避免重復發(fā)送請求

    axios請求二次封裝之避免重復發(fā)送請求

    在做vue中大型項目的時候,官方推薦使用axios,但是原生的axios可能對項目的適配不友好,所以在工程開始的來封裝一下axios,下面這篇文章主要給大家介紹了關于axios請求二次封裝之避免重復發(fā)送請求的相關資料,需要的朋友可以參考下
    2022-10-10
  • Vue如何使用Element-ui表單發(fā)送數(shù)據(jù)與多張圖片到后端詳解

    Vue如何使用Element-ui表單發(fā)送數(shù)據(jù)與多張圖片到后端詳解

    在做項目的時候遇到一個問題,前端需要上傳表單到后端,表單數(shù)據(jù)包括文本內(nèi)容和圖片,這篇文章主要給大家介紹了關于Vue如何使用Element-ui表單發(fā)送數(shù)據(jù)與多張圖片到后端的相關資料,需要的朋友可以參考下
    2022-04-04

最新評論