Vue3 中如何從 Parent 呼叫 Child Component 的 Method?

本篇文章將深入探討在 Vue3 中如何從 Parent 呼叫 Child Component 的 Method。我們將比較 Options API 和 Composition API 的實現方式,並詳細說明它們在呼叫上的差異。如果你想學習如何更好地使用 Vue3,不要錯過這篇文章!

Vue3 中如何從 Parent 呼叫 Child Component 的 Method?
Photo by krakenimages / Unsplash

最近在開發專案時,遇到了一個問題:如何從父元件呼叫子元件的方法,尤其是在 Vue3 中。每當我需要實作這個功能時,總是容易忘記該使用哪種方式:是使用 Options API,還是使用 Composition API?而且,每種方式在呼叫上也有微妙的差異。因此,我特別寫下這篇文章,記錄下來作為日後的參考,以免再次浪費時間在尋找解答上。

程式範例

Options API

如果你曾經開發過 Vue2,使用 Options API,對你來說應該會比較熟悉一點。
以下是一個使用範例:

<script>
import ChildComponent from 'path/to/child-component.vue'

export default {
  name: 'ParentComponent',

  components: {
    ChildComponent
  },

  setup() {
    // do something
  },

  methods: {
    callChildComponentMethod() {
      this.$refs.childComponentRef.childComponentMethod()
    }
  }
}
</script>

<template>
  <div>
    <ChildComponent ref="childComponentRef" />
  </div>
</template>

child

<script>
  export default {
    name: 'ChildComponent',

    setup() {
      // do something
    },

    expose: ['childComponentMethod'], // 沒有使用預設全部 methods 都會是 public

    methods: {
      childComponentMethod() {
        // do something
      }
    }
  }
</script>

Composition API

Composition API 在 Vue3 中第一次採用這種寫法,算是比較新潮的一種寫法,在使用上可能會需要一點轉換成本

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

const childComponentRef = ref(null);

function handleClick() {
  childComponentRef.value.doSomething();
}

</script>

<template>
  <div>
    <ChildComponent ref="childComponentRef" />
  </div>
</template>

child

<script setup>
import { defineExpose } from "vue";

function doSomething() {
  console.log("doSomething");
}
// defineExpose 將需要的 method public 出去
defineExpose({
  doSomething,
});
</script>

參考資料

https://vuejs.org/api/options-state.html#expose
https://vuejs.org/api/sfc-script-setup.html#defineexpose