Vue3 provide 関数
provide関数は Vue3 が提供する高階関数であり、コンポーネントツリー内の親コンポーネントから子コンポーネントへデータを渡すために使用されます。従来のpropsと比較して、provideとinjectデータを共有するためのより柔軟な方法を提供し、特にコンポーネントの階層が深い場合に役立ちます。
使用provide関数を使用する場合、親コンポーネントはそれを介して子コンポーネントにデータやメソッドを公開でき、子コンポーネントはinject関数を介してこれらのデータやメソッドを受け取ることができます。
provide 関数の基本的な使い方
以下は簡単な例で、provide関数を使って親コンポーネントでデータを提供し、子コンポーネントでinject関数でデータを受け取る方法を示しています。
親コンポーネント
例
<div>
<ChildComponent />
</div>
</template>
<script>
import { provide } from 'vue';
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
setup() {
const message = 'Hello from Parent!';
provide('message', message);
}
};
</script>
子コンポーネント
例
<div>
<p>{{ injectedMessage }}</p>
</div>
</template>
<script>
import { inject } from 'vue';
export default {
setup() {
const injectedMessage = inject('message');
return {
injectedMessage
};
}
};
</script>
この例では、親コンポーネントはprovide関数を介して文字列を渡し、message子コンポーネントはinject関数を介してこのメッセージを受け取り、表示しました。
provide 関数の高度な使い方
provide関数は単純なデータだけでなく、メソッド、オブジェクト、さらにはリアクティブデータも渡すことができます。これにより、複雑なアプリケーションのシナリオで非常に役立ちます。
リアクティブデータの受け渡し
Vue3 では、ref 或 reactiveを使用してリアクティブデータを作成し、それをprovide関数を介して子コンポーネントに渡すことができます。
例
<div>
<ChildComponent />
</div>
</template>
<script>
import { provide, reactive } from 'vue';
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
setup() {
const state = reactive({
count: 0
});
provide('state', state);
return {
state
};
}
};
</script>
子コンポーネントでは、inject関数を使用してこのリアクティブオブジェクトを取得し、それを操作できます。
例
<div>
<p>Count: {{ state.count }}</p>
<button @click="state.count++">Increment</button>
</div>
</template>
<script>
import { inject } from 'vue';
export default {
setup() {
const state = inject('state');
return {
state
};
}
};
</script>
provide 関数の注意点
使用する際は、provide関数を使用する際、以下の点に注意してください。
1. 名前の競合
使用する際provideとinjectに、複数の親コンポーネントが同じ名前のデータを提供すると、子コンポーネントは最も近い親コンポーネントが提供したデータを受け取ります。したがって、名前の競合を避けるには、一意な名前を使用することをお勧めします。
2. リアクティブデータの処理
リアクティブデータを渡す場合、子コンポーネントはこれらのデータを直接変更できます。子コンポーネントにデータを読み取り専用にさせ、変更させたくない場合は、readonly関数を使用してリアクティブデータをラップできます。
例
export default {
setup() {
const state = reactive({
count: 0
});
provide('state', readonly(state));
}
};
その他の拡張
Vue3 オプション API