ホームページ  >  に質問  >  本文

VueJS の型参照のプロビジョニング/インジェクション機能

<p>親コンポーネントから型付き ref を提供し、それを子コンポーネントに注入しようとしています。 </p> <p>VueJS ドキュメントを理解したかどうかはわかりませんが、これが私が思いついたものです。 </p> <pre class="brush:php;toolbar:false;">タイプ { Ref } を 'vue' からインポートします 'vue' からタイプ { InjectionKey } をインポートします '@/types/DocumentSet' からタイプ DocumentSet をインポートします const documentSet = Symbol() as InjectionKey<{ documentSet: Ref<DocumentSet>、 更新: () => 無効 }>> デフォルトの documentSet</pre> をエクスポートします。 <p>したがって、タスクは型付きオブジェクト (私の場合は documentSet) とそれを更新する関数を提供することです。 </p> <p>親コンポーネントには次のコードがあります: </p> <pre class="brush:php;toolbar:false;">dsKey を '@/injectionKeys/documentSet' からインポートします '@/types/DocumentSet' からタイプ DocumentSet をインポートします ... const documentSet = ref(null) Provide(dsKey, { ドキュメントセット、 更新: () => console.log('更新') })</pre> <p>子コンポーネントには次のコードがあります: </p> <pre class="brush:php;toolbar:false;">dsKey を '@/injectionKeys/documentSet' からインポートします const ds = インジェクト(dsKey) const documentSet = ds?.documentSet</pre> <p>問題は、定型コードがたくさんあるので、何か間違ったことをしているように感じることです。たとえば、なぜ ds オブジェクトを次のようにリファクタリングする必要があるのか​​理解できません: </p> <pre class="brush:php;toolbar:false;">const { documentSet } = ds</pre> <p><code>ds?.documentSet</code> を記述する代わりにコードを短縮することは可能ですか。特に ds が存在するはずであると確信している場合 (ds がないと子コンポーネントをレンダリングできません)< ;/p> <p><code>const { documentSet } = inject(dsKey)</code> と書くと、次のエラーが表示されます。 </p> <p><code>TS2339: プロパティ 'documentSet' はタイプ '{ documentSet: Ref ;' 更新: () => 無効; } | 未定義 '.</code></p> <p>このアイデアは、子コンポーネントの重複を排除したいためです。</p> <pre class="brush:php;toolbar:false;"><DocumentSetInfo :documentSet="ドキュメントセット" /> <ドキュメントセットメモ :documentSet="ドキュメントセット" /> <ドキュメントセットプログラム :documentSet="ドキュメントセット" /> <DocumentSetPetition :documentSet="ドキュメントセット" /> <DocumentSetPassRequests :documentSet="ドキュメントセット" /> <ドキュメントセットレポート :documentSet="ドキュメントセット" /> <DocumentSet受付通知 :documentSet="ドキュメントセット" /><

P粉441076405P粉441076405434日前534

全員に返信(1)返信します

  • P粉446800329

    P粉4468003292023-09-05 09:24:21

    これを、プロビジョニングを処理する関数 provde と、注入を処理する関数 use* を提供するコンポーザブルに入れることができます。

    リーリー

    これで、親コンポーネントで provideCurrentDocumentSet() を呼び出すだけで済み、すべての子コンポーネントは次の操作を実行するだけで済みます。

    リーリー

    InjectionKey をエクスポートする必要さえありません。また、コンポーネントはそれについて知る必要もありません。 (たとえば、Vuetify もこれを行います。たとえば、here)

    返事
    0
  • キャンセル返事