vue.js3超初心者向け。親コンポーネントで子コンポーネントを動作させる方法

vue.js3超初心者向け。親コンポーネントで子コンポーネントを動作させる方法

8 回閲覧されました

みなさんこんにちは、jonioです。

今回はvue.js3で親コンポーネントで子コンポーネントを動作させる方法について簡単な解説します。

Laravelの無料学習サイトを作りました

Laravelを勉強したい人向けの無料の学習サイトを作りました。

ここからリンクに飛べますのでぜひ利用してください。

コード

親コンポーネントの記述を下記にします。

<template>
  <div>
    <button @click="show = true">開く</button>

    <ChildModal v-if="show" />
  </div>
</template>

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

const show = ref(false)
</script>

子コンポーネントのコードを下記にします。

<template>
  <div class="modal">
    <p>これはモーダルです</p>
    <button @click="emit('close')">× 閉じる</button>
  </div>
</template>

<script setup>
const emit = defineEmits(['close'])
</script>

コードの解説

子コンポーネントを親コンポーネントで開くのは簡単です。

親コンポーネントの3行目をクリックすると5行目でshowがtrueになるので開きます。

問題は子コンポーネントの閉じ方です。

親コンポーネントで子コンポーネントが表示されているので子コンポーネントで直接コードを書いて閉じようとさせても動作しません。

どうするかというと子コンポーネントのメソッドを親コンポーネントに渡さないといけません。

それをしているのが子コンポーネントの9行目です。

「defineEmits([‘親コンポーネントに渡すメソッド名’])」と記述します。

サンプルコードの親コンポーネントに渡すメソッド名は「close」です。

それだけではダメでcloseメソッドを使う時に「emit(‘close’)」(4行目)と記述しないといけません。

親コンポーネントで子コンポーネントのcloseを受け取る為に下記のコードに修正します。

<template>
  <div>
    <button @click="show = true">開く</button>

    <ChildModal v-if="show" @close="show = false" />          //この行を修正
  </div>
</template>

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

const show = ref(false)
</script>

「@close」がありますがcloseは子コンポーネントから渡されたメソッド名です。

これで子コンポーネントのcloseメソッドを親コンポーネントで動作させることができます。