{{ keyword }}在Vue3父子組件傳值的實現方式

在Vue3中,父子組件是常見的組件通信方式,而實現父子組件傳值則是其中比較重要的一種應用場景。本文將從以下幾個方面來詳細介紹Vue3中實現父子組件傳值的幾種方式。

一、props

在Vue3中,props依然是一個非常重要的屬性,通過在子組件中設置props選項,可以讓父組件向子組件傳遞數據:


// 父組件傳遞數據到子組件
<template>
  <child-component :message="parentMessage">
  </child-component>
</template>

<script>
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from parent component'
    };
  }
}
</script>

// 子組件接收props數據
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: {
    message: String
  }
}
</script>

此時,父組件向子組件傳遞了一個字符串類型的message數據,而子組件接收到該數據並直接在頁面中渲染出來。

二、依賴注入provide/inject

在Vue3新增了provide/inject選項,用於實現父組件向子孫組件傳遞數據,使用方式如下:


// 父組件提供數據
<template>
  <child-component>
  </child-component>
</template>

<script>
import { provide } from 'vue';
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  setup() {
    const parentMessage = 'Hello from parent component';
    provide('message', parentMessage);
  }
}
</script>

// 子組件接收provide中的數據
<template>
  <grandchild-component></grandchild-component>
</template>

<script>
import { inject } from 'vue';
import GrandchildComponent from './GrandchildComponent';

export default {
  components: {
    GrandchildComponent
  },
  setup() {
    const message = inject('message');
    return {
      message
    }
  }
}
</script>

// 孫子組件中使用父組件提供的數據
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  setup(props, { attrs, slots, emit }) {
    // 這裡也可以使用inject來獲取到父組件提供的數據
  }
}
</script>

在父組件中使用provide來提供數據,而在子孫組件中使用inject來獲取父組件提供的數據。需要注意的是,provide/inject是依賴底層組件實例的引用來實現的,所以不能在setup函數外使用。

三、$attrs/$listeners

在Vue3中,$attrs/$listeners是一種新的組件屬性,前者獲取父組件傳遞過來的非prop屬性,後者獲取父組件傳遞過來的非prop事件,使用方式如下:


// 父組件向子組件傳遞非prop屬性和事件
<template>
  <child-component title="Hello World" @click="doSomething"></child-component>
</template>

// 子組件中使用$attrs和$listeners來訪問父組件傳遞過來的數據
<template>
  <div :title="$attrs.title" @click="$listeners.click"></div>
</template>

<script>
export default {
  inheritAttrs: false // 必須設置,否則會將所有的非prop屬性透傳到根元素上
}
</script>

這裡子組件中使用$attrs.data來訪問title屬性,$listeners.click來訪問click事件。

四、$emit

在Vue3中,$emit是一種子組件向父組件傳遞數據的方法,使用方式如下:


// 子組件向父組件傳遞數據
<template>
  <div @click="sendMessage"></div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message', 'Hello from child component');
    }
  }
}
</script>

// 父組件接收子組件傳遞過來的數據
<template>
  <child-component @message="handleMessage"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log(message);
    }
  }
}
</script>

子組件中通過$emit來傳遞數據,而父組件則通過@message來監聽message事件,並在回調函數中獲取到子組件傳遞過來的數據。

五、ref/$refs

在Vue3中,ref/$refs是一種組件引用方式,可以在父組件中通過ref屬性來獲取到子組件實例,從而可以調用子組件中的方法和屬性,使用方式如下:


// 父組件中獲取子組件實例
<template>
  <child-component ref="child"></child-component>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  setup() {
    const childRef = ref(null);
    return {
      childRef
    }
  },
  mounted() {
    console.log(this.$refs.child); // 這裡也可以獲取到子組件實例
  }
}
</script>

// 子組件中可以通過this.$emit來向父組件傳遞數據
<template>
  <div></div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message', 'Hello from child component');
    }
  }
}
</script>

在父組件中,可以通過ref來獲取到子組件的實例,在子組件中則可以通過this.$emit來向父組件傳遞數據。

通過以上五種方式,我們可以在Vue3中實現父子組件之間的數據傳遞和通信。需要根據實際場景來選擇不同的實現方式,以達到更好的應用效果。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:10
下一篇 2024-12-12 12:10

相關推薦

  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網絡應用中流…

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

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

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

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

    編程 2025-04-29
  • Python在線編輯器的優勢與實現方式

    Python在線編輯器是Python語言愛好者的重要工具之一,它可以讓用戶方便快捷的在線編碼、調試和分享代碼,無需在本地安裝Python環境。本文將從多個方面對Python在線編輯…

    編程 2025-04-28
  • Java表單提交方式

    Java表單提交有兩種方式,分別是get和post。下面我們將從以下幾個方面詳細闡述這兩種方式。 一、get方式 1、什麼是get方式 在get方式下,表單的數據會以查詢字符串的形…

    編程 2025-04-27
  • 用Pythonic的方式編寫高效代碼

    Pythonic是一種編程哲學,它強調Python編程風格的簡單、清晰、優雅和明確。Python應該描述為一種語言而不是一種編程語言。Pythonic的編程方式不僅可以使我們在編碼…

    編程 2025-04-27
  • Java多版本支持實現方式

    本文將從以下幾個方面闡述如何實現Java多版本支持,並給出可行的代碼示例。 一、多版本Java環境概述 Java是一門跨平台的編程語言,但是在不同的應用場景下,可能需要使用不同版本…

    編程 2025-04-27
  • SpringBoot Get方式請求傳參用法介紹

    本文將從以下多個方面對SpringBoot Get方式請求傳參做詳細的闡述,包括URL傳參、路徑傳參、請求頭傳參、請求體傳參等,幫助讀者更加深入地了解Get請求方式下傳參的相關知識…

    編程 2025-04-27
  • Python獲取APP數據的多種方式

    如果您需要對APP進行分析、數據採集、監控或者自動化測試,那麼您一定需要獲取APP的數據。本文將會介紹一些Python獲取APP數據的方式。 一、使用ADB工具獲取APP數據 AD…

    編程 2025-04-27
  • Python中用空格隔開的使用方式

    Python是一種高級編程語言,非常流行,因為它有很多有用的功能。其中一個有用的功能是用空格隔開代碼。在本文中,我們將從多個方面討論Python中如何使用空格隔開代碼。 一、Pyt…

    編程 2025-04-27

發表回復

登錄後才能評論