slot経由で親に値を返す
Vue.jsでslot経由の子コンポーネントから親コンポーネントに値を返すプログラムに挑戦してみました!
今回はVue3、Nuxt3、TypeScriptの組み合わせで実装しています。
下記コマンドでインストールします。
npx nuxi init my-nuxt3-project
cd my-nuxt3-project
npm install
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を使ってみたりしていろいろ試してみましたが、上手くいかず悩みました。
もっと良い方法があるのかも知れませんが、とりあえず無事に受けとることができました。
どうですか?今回の記事は理解できましたか?
今回の内容は初心者のポンコツ2人組には厳しいようですね・・・
ですが、あきらめず頑張って勉強しましょうね!