slot経由で親に値を返す

Vue.jsでslot経由の子コンポーネントから親コンポーネントに値を返すプログラムに挑戦してみました!
今回はVue3、Nuxt3、TypeScriptの組み合わせで実装しています。
下記コマンドでインストールします。
npx nuxi init my-nuxt3-project
cd my-nuxt3-project
npm install

※この記事は2024/08/09時点の情報です。

components/ComponentB.vue
slotを実装しているだけのソースです。

<!-- 子コンポーネント (B) -->
<template>
    <div>
      <!-- スロットを表示 -->
      <slot></slot>
    </div>
  </template>
  
  <script setup>
 
  </script>

components/ComponentC.vue
propsで親からコールバック用のファンクションを受け取ります。 ボタンをクリックするとコールバック用のファンクションに値を渡して親に返します。

<!-- 子コンポーネント (C) -->
<template>
    <div>
      <!-- 子から親にデータを渡すためのボタン -->
      <button @click="sendDataToParent">Send Data to Parent</button>
    </div>
  </template>
  
  <script setup>
  const props = defineProps({
    callbackFromChild: Function, // 親から渡されるメソッドの型を指定
  });

  // 子から親に渡すデータを定義
  const dataToSend = 'Hello from child!';
  
  // 子から親にデータを送信するメソッド
  const sendDataToParent = () => {
    // 親コンポーネントで定義したメソッドを呼び出す
    props.callbackFromChild(dataToSend);
  };
  </script>

pages/Chart.vue
今回のサンプルのメインページです。
コンポーネントBのスロットにコンポーネントCを配置し、コールバック用のファンクションを渡しています。

<!-- 親コンポーネント (A) -->
<template>
    <div>
      <!-- コンポーネント B を呼び出し、スロット内にコンポーネント C を設置 -->
      <ComponentB>
        <ComponentC :callbackFromChild="handleCallback" />
      </ComponentB>
    </div>
  </template>
  
  <script setup>
  import ComponentB from '@/components/ComponentB.vue'; // ComponentB のインポート
  import ComponentC from '@/components/ComponentC.vue'; // ComponentC のインポート
  
  // 親コンポーネントでメソッドを定義
  const handleCallback = (dataFromChild) => {
    console.log('コンポーネントCからの値を受け取りました:', dataFromChild);
    // ここで親コンポーネントの処理を実行
  };
  </script>

emitを使ってみたりしていろいろ試してみましたが、上手くいかず悩みました。
もっと良い方法があるのかも知れませんが、とりあえず無事に受けとることができました。

どうですか?今回の記事は理解できましたか?

Nuxt3とChart.jsで積み上げ棒グラフを表示するプログラムを覚えられましたか?

今回の内容は初心者のポンコツ2人組には厳しいようですね・・・
ですが、あきらめず頑張って勉強しましょうね!

管理人情報