Vue3 組件通信:從基礎到高級

一、props

Vue3 中的組件通信最基礎的方式就是通過 props 來進行父子組件之間的數據通信。在父組件中使用 v-bind 來將數據傳遞給子組件,子組件通過 props 來接收傳遞過來的數據。

// 父組件
<template>
  <child-component :message="message"></child-component>
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello World'
    }
  }
}
</script>

// 子組件
<template>
  <p>{{message}}</p>
</template>
<script>
export default {
  props: {
    message: {
      type: String,
      required: true
    }
  }
}
</script>

在上面的例子中,父組件通過 v-bind 將 message 這個數據傳遞給了子組件,子組件通過 props 來接收了這個數據並進行渲染。在 props 中我們還可以設置傳遞的值的類型、是否必填等參數。

二、emit

除了從父組件到子組件的單向傳遞數據外,我們還需要進行反向的數據傳遞。可以通過自定義事件(emit)來實現子組件向父組件傳遞數據。

// 子組件
<template>
  <button v-on:click="handleClick">Click me</button>
</template>
<script>
export default {
  methods: {
    handleClick() {
      this.$emit('message', 'Hello World')
    }
  }
}
</script>

// 父組件
<template>
  <child-component @message="handleMessage"></child-component>
</template>
<script>
export default {
  methods: {
    handleMessage(message) {
      console.log(message)
    }
  }
}
</script>

在上面的例子中,子組件通過 $emit 來觸發自定義事件 message 並將數據傳遞給了父組件,父組件通過 v-on 來監聽該事件並獲取子組件傳遞過來的數據。

三、provide / inject

Vue3 中新增了一個 provide / inject API 來進行祖先組件向後代組件的數據傳遞。

// 祖先組件
<template>
  <child-component></child-component>
</template>
<script>
export default {
  provide() {
    return {
      message: 'Hello World'
    }
  }
}
</script>

// 後代組件
<template>
  <p>{{message}}</p>
</template>
<script>
export default {
  inject: ['message']
}
</script>

在上面的例子中,祖先組件通過 provide 來提供一個名為 message 的值給其所有後代組件,在後代組件中通過 inject 來接收這個值。

四、ref / $refs

在 Vue3 中,可以在父組件中通過 ref 來獲取子組件的實例對象,從而可以在父組件中調用子組件的方法或獲取子組件的數據。

// 父組件
<template>
  <child-component ref="child"></child-component>
</template>
<script>
export default {
  mounted() {
    this.$refs.child.sayHello()
  }
}
</script>

// 子組件
<script>
export default {
  methods: {
    sayHello() {
      console.log('Hello World')
    }
  }
}
</script>

在上面的例子中,父組件使用 ref 來獲取子組件的實例對象,從而可以在 mounted 鉤子函數中調用子組件的 sayHello 方法。

五、Teleport

在 Vue3 中,Teleport 組件可以實現在任意地方渲染組件,並保持父子組件間的關係,可以用於實現一些彈窗組件等。

// 父組件
<template>
  <button v-on:click="openDialog">Open Dialog</button>
  <teleport to="body">
    <dialog :visible="isDialogVisible" @close="closeDialog"></dialog>
  </teleport>
</template>
<script>
import { ref } from 'vue'
import Dialog from './Dialog.vue'

export default {
  components: {
    Dialog
  },
  setup() {
    const isDialogVisible = ref(false)

    function openDialog() {
      isDialogVisible.value = true
    }

    function closeDialog() {
      isDialogVisible.value = false
    }

    return {
      isDialogVisible,
      openDialog,
      closeDialog
    }
  }
}
</script>

// 子組件 - Dialog
<template>
  <div v-if="visible">
    <button v-on:click="$emit('close')">Close Dialog</button>
  </div>
</template>
<script>
import { defineComponent, ref } from 'vue'

export default defineComponent({
  props: {
    visible: {
      type: Boolean,
      required: true
    }
  },
})
</script>

在上面的例子中,Teleport 組件通過 to 屬性來指定要渲染的位置,在這裡我們指定為 body。在父組件中點擊按鈕,會觸發 openDialog 方法從而顯示 Dialog 組件,Dialog 組件中通過 $emit 來觸發 close 事件從而將 Dialog 關閉。

總結

本文介紹了 Vue3 中五種常用的組件通信方式:props、emit、provide / inject、ref / $refs 和 Teleport。在實際開發中,應根據場景選擇合適的通信方式來進行組件間的數據傳遞,以實現更高效的應用。

原創文章,作者:QBJWB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/361186.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QBJWB的頭像QBJWB
上一篇 2025-02-24 00:34
下一篇 2025-02-24 00:34

相關推薦

  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python零基礎PDF下載

    本文將為大家介紹如何使用Python下載PDF文件,適合初學者上手實踐。 一、安裝必要的庫 在Python中,我們需要使用urllib和requests庫來獲取PDF文件的鏈接,並…

    編程 2025-04-29
  • 樹莓派DIY無人機一:製作基礎

    本文將介紹如何使用樹莓派製作一個可飛行的小型無人機。本文將介紹樹莓派的選型、比例積木的使用、無線電通信以及如何控制飛行器的基本運動。 一、樹莓派的選型 在DIY無人機中,樹莓派是必…

    編程 2025-04-29
  • Polyphone音頻編輯器基礎入門教程

    Polyphone是一款免費的音頻編輯器,可用於編輯.sf2和.sfz格式的音色庫。本文將詳細介紹Polyphone的基礎操作及使用方法。 一、安裝和簡介 首先,我們需要下載並安裝…

    編程 2025-04-29
  • 如何修改ant組件的動效為中心

    當我們使用Ant Design時,其默認的組件動效可能不一定符合我們的需求,這時我們需要修改Ant Design組件動效,使其更加符合我們的UI設計。本文將從多個方面詳細闡述如何修…

    編程 2025-04-29
  • Ant Design組件的動效

    Ant Design是一個基於React技術棧的UI組件庫,其中動效是該組件庫中的一個重要特性之一。動效的使用可以讓用戶更清晰、更直觀地了解到UI交互的狀態變化,從而提高用戶的滿意…

    編程 2025-04-29
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28
  • Python元祖排序:從基礎知識到高級應用

    Python元祖是一種不可變序列,通常用於將一組數據綁定在一起。元祖之間經常需要排序,本文將從基礎知識到高級應用,為你詳細講解Python元祖排序。 一、排序方法 Python提供…

    編程 2025-04-28

發表回復

登錄後才能評論