0Pricing
Vue Academy · レッスン

子コンポーネントでのinject()

デフォルト値付きのinject()、必須インジェクション、名前空間に使うSymbolキーについて学習します。

「子コンポーネントでのinject()」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。

inject 関数

inject は、同じキーを使って祖先コンポーネントが提供した値を取得します。<script setup> で呼び出します。

import { inject } from "vue";
const theme = inject("theme");

リアクティビティは維持される

祖先コンポーネントが ref を提供した場合、inject される値は同じ ref です。theme.value の読み取りはリアクティブなままで、提供元が値を変更すると更新されます。

const theme = inject("theme");
// in template: {{ theme }} (auto-unwrapped)

デフォルト値を提供する

どの祖先コンポーネントもキーを提供していない場合、inject は undefined を返します。2 番目の引数にデフォルト値を渡すと、コンポーネントを適切に動作させられます。

const theme = inject("theme", "light");
// "light" used when nothing was provided

ファクトリーデフォルト

オブジェクトや生成コストの高いデフォルト値には、ファクトリ関数を渡し、3 番目の引数を true にします。こうすると、必要な場合にだけデフォルト値が生成されます。

const config = inject("config", () => ({ retries: 3 }), true);

アクションを inject する

提供元が関数も提供している場合は、同じ方法で inject し、変更を要求するために呼び出します。変更を管理するのは提供元です。

const updateName = inject("updateName");
updateName("Grace");

store オブジェクトを inject する

提供元が state とアクションをまとめている場合は、オブジェクト全体を inject し、必要なものを分割代入します。

const { user, updateName } = inject("userStore");

TypeScript で型安全に inject する

Vue は、inject を型安全にするために InjectionKey<T> を提供しています。型付きキーによって、inject される値の形状を TypeScript に正確に伝えられます。

import type { InjectionKey, Ref } from "vue";
export const themeKey: InjectionKey<Ref<string>> = Symbol("theme");

型付きキーを使う

型付きキーを使って provide と inject を行います。これで TypeScript が値の型を推論し、不一致を検出してくれます。

provide(themeKey, theme);          // theme: Ref<string>
const theme = inject(themeKey);    // inferred Ref<string> | undefined

一意性のための Symbol キー

キーに Symbol を使うと(InjectionKey と組み合わせることもよくあります)、大規模なコードベースで無関係な provider 同士の文字列キーが衝突することを確実に防げます。

export const authKey = Symbol("auth") as InjectionKey<AuthService>;

Provider がない場合に対処する

厳密な構成では、必須の injection が見つからない場合にエラーを投げるとよいでしょう。undefined を黙って使うのではなく、配線の問題を早期に発見できます。

const auth = inject(authKey);
if (!auth) throw new Error("auth provider missing");

サブツリー内のどこからでも inject する

どこかの祖先コンポーネントがキーを提供していれば、コンポーネントは深さに関係なく inject できます。途中のコンポーネントに変更を加えずに済むことが、provide/inject の目的です。

確認問題

Provider が存在しない場合、inject("theme", "light") は何を返しますか。

まとめ

inject(key) で提供された値を読み取り、ref のリアクティビティを維持できることを学びました。デフォルト値(またはファクトリ)を渡すと適切なフォールバックを設定でき、Symbol キーと InjectionKey<T> を使うと型安全で衝突のない injection を実現できます。

よくある質問

「子コンポーネントでのinject()」レッスンは無料ですか?

はい。「子コンポーネントでのinject()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。

「子コンポーネントでのinject()」で何を学びますか?

デフォルト値付きのinject()、必須インジェクション、名前空間に使うSymbolキーについて学習します。 ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「子コンポーネントでのinject()」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Prop Drillingの問題
  2. 親コンポーネントでのprovide()
  3. 子コンポーネントでのinject()
  4. アプリレベルの状態管理にProvide/Injectを使う
← Vue Academyに戻る