パーシャルは、スロットと同じように、フォールバックコンテンツをサポートする必要があります。 これにより、テンプレートを特定の方法で使用するときに、テンプレートの読みやすさが大幅に向上します。
いくつかのロジック(ダイアログなど)を持つ基本コンポーネントがあり、そこから同じロジックと(外部)テンプレートを共有する他のコンポーネント(PromptDialogなど)を派生させる必要があります。 これは、スロットが使用されるのと同様のパーシャルを使用することによって実現されますが、インスタンスではなくコンポーネントベースで行われます。
このようなテンプレートは次のようになります。
<div>
<div class="header">
<partial name="header">
<i class="fa-whatever"></i>
{{title}}
</partial>
</div>
<div class="body">
<partial name="body">
{{{body}}}
</partial>
</div>
<div class="footer">
<partial name="footer">
<!-- some stuff for button rendering -->
</partial>
</div>
</div>
この機能がないと、すべてのパーシャルノードのコンテンツをテンプレートの外に配置する必要があります。ネストされたパーシャルを使用するとさらに悪化します。
派生インスタンスのテンプレートでベースコンポーネントを使用して問題にアプローチする-したがって、ネストされたインスタンスを持つことは実用的ではありません。データ/プロップとAPIの大部分を外部(疑似派生)から内部にリダイレクトする必要があるためです。 (ベース)インスタンス。
申し訳ありませんが、パーシャルの代わりにスロットを使用することがオプションではない理由がわかりませんでした:sweat_smile:
その理由はありますか?
スロットを使用する場合、疑似派生の_PromptDialog_には次のテンプレートがあります。
<dialog
:foo.sync="foo"
>
<input
v-model="thePromptedValue"
slot="body"
>
</dialog>
元の_Dialog_コンポーネントのすべての属性_foo_について、外側の_PromptDialog_に同じ属性を設定し、内側に渡す必要があります。 _Dialog_で定義されているすべてのメソッドについても同じことが言えます。内部への呼び出しを渡すプロキシを定義する必要があります。 これは面倒で、コンポーネントの拡張/クラスの継承の背後にある考え方を打ち負かします。
私はそれが部分的な虐待だと思います。 子のデータコンテキストを認識しながら、部分的なスニペットが親からのものであるため、これを行うことはお勧めできません。 これはタイトなデカップリングです。
ダイアログコンポーネントは、純粋に表示的なものであるため、独自の状態を保持するべきではありません。 状態を伝えないでください。 状態と表示されるコンテンツの両方が、ダイアログを使用する親コンポーネントに属している必要があります。
最も参考になるコメント
私はそれが部分的な虐待だと思います。 子のデータコンテキストを認識しながら、部分的なスニペットが親からのものであるため、これを行うことはお勧めできません。 これはタイトなデカップリングです。
ダイアログコンポーネントは、純粋に表示的なものであるため、独自の状態を保持するべきではありません。 状態を伝えないでください。 状態と表示されるコンテンツの両方が、ダイアログを使用する親コンポーネントに属している必要があります。