検索

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

ベスト プラクティス: Vue 3 でコンポーネントを DOM にアタッチする方法

<p>Vue 3 アプリケーションのシングル ファイル コンポーネント (SFC) 内にコンポーネントを動的に作成し、DOM に追加したいと考えています。私は <code><script setup></code> スタイル コンポーネントを使用していますが、それは別の問題です。 </p> <p>これは不必要に難しいようです。 </p> <p>私がやりたいことは大まかに次のとおりです:</p> <ol> <li>データを取得します。完成しました。 </li> <li>Vue コンポーネントのインスタンス (Foo.vue) を作成します。 </li> <li>データをプロパティとして渡します。 </li> <li>必要な場所に追加します。 </li> </ol> <p>問題は、テンプレートがレンダリングされてからどのくらい時間がかかるかわからないため、テンプレートで <component :is="Foo:> を使用できないことです。</p> <p>ベストプラクティスはありますか?簡単な例を教えていただける親切な方がいらっしゃいましたら、よろしくお願いいたします。 </p> <p>Vue ドキュメントを半分も理解できないことがあります。申し訳ありませんが、言いたくないのですが、Vue の初心者にとって、これらは非常にわかりにくく、愚かに感じます。 </p> <p>これが私がやろうとしている偽のコードです: </p> <pre class="brush:php;toolbar:false;">「../components/Foo.vue」から Foo をインポート 関数 makeAFoo(p, data){ // Foo.vue をインスタンス化し (これをインラインで行う方法がわかりません)、必要なデータを渡します let foo = new Foo(data); // こんなに単純だったらいいのにね? //それを p (HTML 要素) に追加します p.appendChild(foo) }</pre> <p><br /></p>
P粉362071992P粉362071992451日前594

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

  • P粉004287665

    P粉0042876652023-08-25 18:25:26

    もっと簡単な方法は、v-if または v-for を使用することです。

    コンポーネントを直接扱うよりも、コンポーネントの状態を扱い、Vue の応答性の高い魔法を働かせるほうがよいでしょう。

    これは例であり、コンポーネント(トースト)を動的に追加し、コンポーネントの状態を操作するだけです

    Toast.vue ファイル: ここの v-for はリアクティブであり、新しいエラーがエラー オブジェクトに追加されるたびにレンダリングされます

    リーリー

    ErrorTrigger.vue: クリック イベントが発生するたびに、エラーをエラー オブジェクトにプッシュします

    リーリー

    完全な例: https://stackblitz.com/edit/vitejs-vite-mcjgkl

    返事
    0
  • P粉598140294

    P粉5981402942023-08-25 00:33:13

    オプション 1: createVNode(component, props)render(vnode,container)

    を使用します。

    作成: createVNode() を使用して、プロパティを使用してコンポーネント定義の VNode を作成します (たとえば、*.vue から)インポートされた SFC) を render() に渡して、指定されたコンテナ要素でレンダリングできます。

    破棄: render(null,container) を呼び出すと、コンテナにアタッチされている VNode が破棄されます。このメソッドは、親コンポーネントがアンマウントされたときに (unmounted ライフサイクル フック経由で) クリーンアップするために呼び出す必要があります。

    リーリー

    注: このメソッドは内部メソッド (createVNode および render) に依存しており、将来のバージョンではリファクタリングまたは削除される可能性があります。

    デモ 1

    オプション 2: createApp(component, props) および app.mount(container)

    を使用します。

    作成: createApp() を使用して、 アプリケーション インスタンスを作成します。このインスタンスには、特定のコンテナ要素上でコンポーネントをレンダリングするために使用できる mount() メソッドがあります。

    破壊: アプリケーション インスタンスには、アプリケーションとコンポーネントのインスタンスを破壊するための unmount() メソッドがあります。このメソッドは、親コンポーネントがアンマウントされたときに (unmounted ライフサイクル フック経由で) クリーンアップするために呼び出す必要があります。

    リーリー

    注: このメソッドは、コンポーネントごとにアプリケーション インスタンスを作成します。ドキュメント内で複数のコンポーネントを同時にインスタンス化する必要がある場合、かなりのオーバーヘッドが発生する可能性があります。

    デモ 2

    使用例

    リーリー

    返事
    0
  • キャンセル返事