Vue コンテンツ配信スロット
前の言葉
コンポーネントを構成するには、親コンポーネントのコンテンツと子コンポーネント独自のテンプレートを混合する方法が必要です。このプロセスは コンテンツ配信 (または「トランスクルージョン」) と呼ばれます。 Vue は、生のコンテンツのスロットとして特別な <slot>
要素を使用して、現在のドラフト Web コンポーネント仕様に準拠したコンテンツ配布 API を実装します。この記事では、Vue コンテンツ配布スロットについて詳しく紹介します<slot>
元素作为原始内容的插槽。本文将详细介绍Vue内容分发slot
编译作用域
在深入内容分发 API 之前,先明确内容在哪个作用域里编译。假定模板为
<child-component> {{ message }} </child-component>
message
应该绑定到父组件的数据,还是绑定到子组件的数据?答案是父组件。组件作用域简单地说是:父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。
一个常见错误是试图在父组件模板内将一个指令绑定到子组件的属性/方法:
<!-- 无效 --> <child-component v-show="someChildProperty"></child-component>
假定someChildProperty
是子组件的属性,上例不会如预期工作。父组件模板不应该知道子组件的状态
如果要绑定作用域内的指令到一个组件的根节点,应当在组件自己的模板上做:
Vue.component('child-component', { // 有效,因为是在正确的作用域内 template: '<p v-show="someChildProperty">Child</p>', data: function () { return { someChildProperty: true } } })
类似地,分发内容是在父作用域内编译
默认丢弃
一般地,如果子组件模板不包含<slot>
插口,父组件的内容将会被丢弃
var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <p>测试内容</p> </child> </p> `, components: { 'child': childNode }, };
<p id="example"> <parent></parent></p><script src="https://unpkg.com/vue"></script><script>var childNode = { template: ` <p class="child"> <p>子组件</p> </p> `, };var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <p>测试内容</p> </child> </p> `, components: { 'child': childNode }, };// 创建根实例new Vue({ el: '#example', components: { 'parent': parentNode } })</script>
如下图所示, 测试内容
匿名slot
当子组件模板只有一个没有属性的 slot 时,父组件整个内容片段将插入到 slot 所在的 DOM 位置,并替换掉 slot 标签本身
var childNode = { template: ` <p class="child"> <p>子组件</p> <slot></slot> </p> `, };
var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <p>测试内容</p> </child> </p> `, components: { 'child': childNode }, };
如果出现多于1个的匿名slot,vue将报错
var childNode = { template: ` <p class="child"> <p>子组件</p> <slot></slot> <slot></slot> </p> `, };
【默认值】
最初在 <slot>
标签中的任何内容都被视为备用内容,或者称为默认值。备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容
当slot存在默认值,且父元素在
var childNode = { template: ` <p class="child"> <p>子组件</p> <slot><p>我是默认值</p></slot> </p> `, }; var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child></child> </p> `, components: { 'child': childNode }, };
当slot存在默认值,且父元素在
var childNode = { template: ` <p class="child"> <p>子组件</p> <slot><p>我是默认值</p></slot> </p> `, }; var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <p>我是设置值</p> </child> </p> `, components: { 'child': childNode }, };
具名Slot
<slot>
元素可以用一个特殊的属性 name
来配置如何分发内容。多个 slot 可以有不同的名字。具名 slot 将匹配内容片段中有对应 slot
コンパイル スコープ
コンテンツ配布 API について詳しく説明する前に、まずコンテンツがどのスコープでコンパイルされるかを明確にします。テンプレートがvar childNode = { template: ` <p class="child"> <p>子组件</p> <slot name="my-header">头部默认值</slot> <slot name="my-body">主体默认值</slot> <slot name="my-footer">尾部默认值</slot> </p> `, };
であると仮定します。 message
は親コンポーネントのデータにバインドされるべきですか、それとも子コンポーネントのデータにバインドされるべきですか?答えは親コンポーネントです。コンポーネント スコープとは、単に、親コンポーネント テンプレートのコンテンツが親コンポーネント スコープでコンパイルされ、子コンポーネント テンプレートのコンテンツが子コンポーネント スコープでコンパイルされることを意味します。 よくある間違いは、親コンポーネントのテンプレート内で子コンポーネントのプロパティ/メソッドにディレクティブをバインドしようとすることです: var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <p slot="my-header">我是头部</p> <p slot="my-footer">我是尾部</p> </child> </p> `, components: { 'child': childNode }, };
someChildProperty
が子コンポーネントのプロパティであると仮定すると、上記の例は期待どおりに動作しません。親コンポーネントのテンプレートは、子コンポーネントの状態を認識すべきではありません
スコープ付きディレクティブをコンポーネントのルート ノードにバインドしたい場合は、コンポーネント独自のテンプレートでそれを行う必要があります:
var childNode = { template: ` <p class="child"> <p>子组件</p> <slot name="my-body">主体默认值</slot> <slot></slot> </p> `, };
同様に、配布コンテンツは親スコープでコンパイル済みです
デフォルトでは破棄
通常、子コンポーネント テンプレートに <slot>
ソケットが含まれていない場合、コンテンツは下の図に示すように、<子>に含まれる
testコンテンツ
は破棄されます
匿名スロット
時サブコンポーネント テンプレートには属性のないスロットが 1 つだけあり、親コンポーネントのコンテンツ フラグメント全体がスロットが配置されている DOM の場所に挿入され、スロット タグ自体が置き換えられますvar parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <p slot="my-body">我是主体</p> <p>我是其他内容</p> <p slot="my-footer">我是尾部</p> </child> </p> `, components: { 'child': childNode }, };
var childNode = { template: ` <p class="child"> <p>子组件</p> <slot name="my-body">主体默认值</slot> </p> `, };
匿名スロットが複数ある場合は、vueエラーが報告されます
🎜🎜var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <p slot="my-body">我是主体</p> <p>我是其他内容</p> <p slot="my-footer">我是尾部</p> </child> </p> `, components: { 'child': childNode }, };

<slot>
タグ内にあるものはすべて🎜フォールバックコンテンツ🎜とみなされ、デフォルト値として知られています。バックアップ コンテンツは子コンポーネントのスコープでコンパイルされ、ホスト要素が空で挿入するコンテンツがない場合にのみバックアップ コンテンツが表示されます🎜🎜 スロットにデフォルト値があり、親要素に何もない場合<子>コンテンツに挿入すると、デフォルト値が表示されます🎜🎜🎜<p class="child"> <slot text="hello from child"></slot></p>

var childNode = { template: ` <p class="child"> <p>子组件</p> <slot xxx="hello from child"></slot> </p> `, }; var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <template scope="props"> <p>hello from parent</p> <p>{{ props.xxx }}</p> </template> </child> </p> `, components: { 'child': childNode }, };

名前付きスロット
🎜 <slot>
要素では、特別な属性 name
を使用して、コンテンツの配布方法を構成できます。複数のスロットには異なる名前を付けることができます。名前付きスロットは、対応する slot
属性を持つコンテンツ フラグメント内の要素と一致します 🎜🎜🎜var childNode = { template: ` <ul> <slot name="item" v-for="item in items" :text="item.text">默认值</slot> </ul> `, data(){ return{ items:[ {id:1,text:'第1段'}, {id:2,text:'第2段'}, {id:3,text:'第3段'}, ] } } };
var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <template slot="item" scope="props"> <li>{{ props.text }}</li> </template> </child> </p> `, components: { 'child': childNode }, };
が破棄されます 🎜🎜🎜🎜🎜 デフォルトのスロットがない場合、一致するものが見つからないこれらのコンテンツ フラグメントは、も破棄されます 🎜🎜🎜rrreee🎜🎜🎜🎜rrreee🎜🎜🎜
I am other content
作用域插槽
作用域插槽是一种特殊类型的插槽,用作使用一个 (能够传递数据到) 可重用模板替换已渲染元素。
在子组件中,只需将数据传递到插槽,就像将 props 传递给组件一样
<p class="child"> <slot text="hello from child"></slot></p>
在父级中,具有特殊属性 scope
的 <template>
元素必须存在,表示它是作用域插槽的模板。scope
的值对应一个临时变量名,此变量接收从子组件中传递的 props 对象
var childNode = { template: ` <p class="child"> <p>子组件</p> <slot xxx="hello from child"></slot> </p> `, }; var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <template scope="props"> <p>hello from parent</p> <p>{{ props.xxx }}</p> </template> </child> </p> `, components: { 'child': childNode }, };
如果渲染以上结果,得到的输出是
【列表组件】
作用域插槽更具代表性的用例是列表组件,允许组件自定义应该如何渲染列表每一项
var childNode = { template: ` <ul> <slot name="item" v-for="item in items" :text="item.text">默认值</slot> </ul> `, data(){ return{ items:[ {id:1,text:'第1段'}, {id:2,text:'第2段'}, {id:3,text:'第3段'}, ] } } };
var parentNode = { template: ` <p class="parent"> <p>父组件</p> <child> <template slot="item" scope="props"> <li>{{ props.text }}</li> </template> </child> </p> `, components: { 'child': childNode }, };
以上がVue コンテンツ配信スロットの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











特に過去 10 年間で、モバイル デバイスは友人や家族とコンテンツを共有する主な手段となりました。アクセスしやすく使いやすいインターフェイスと、画像やビデオをリアルタイムでキャプチャできる機能により、コンテンツの作成と共有に最適です。ただし、悪意のあるユーザーがこれらのツールを悪用して、閲覧に適しておらず、ユーザーの同意を必要としない不要な機密コンテンツを転送することは簡単です。これを防ぐために、iOS17では「センシティブコンテンツ警告」という新機能が導入されました。それとiPhoneでの使用方法を見てみましょう。新しい機密コンテンツに関する警告とは何ですか?またその仕組みは何ですか?前述したように、機密コンテンツの警告は、ユーザーが iPhone などの機密コンテンツを閲覧できないように設計された新しいプライバシーおよびセキュリティ機能です。

Microsoft Edge ブラウザーを開くページを 360 ナビゲーションに変更するにはどうすればよいですか? それは実際には非常に簡単なので、ここで Microsoft Edge ブラウザーを開くページを 360 ナビゲーションに変更する方法を共有します。見てください。皆さんのお役に立てれば幸いです。 Microsoft Edgeブラウザを開きます。以下のようなページが表示されます。右上隅にある三点アイコンをクリックします。 「設定」をクリックします。設定ページの左欄にある「起動時」をクリックします。右の列の図に示されている 3 つの点をクリックし ([新しいタブを開く] をクリックしないでください)、[編集] をクリックして URL を「0」(またはその他の意味のない数字) に変更します。次に、「保存」をクリックします。次に「」を選択します。

CheatEngine は、ゲームのメモリを編集および変更できるゲーム エディタです。しかし、デフォルトの言語は中国語以外なので、多くの友人にとって不便です。今回はCheatEngineで中国語を設定する方法を編集者が詳しく紹介しますので、お役に立てれば幸いです。設定方法 1: 1. ダブルクリックしてソフトウェアを開き、左上隅の「編集」をクリックします。 2. 次に、下のオプションリストで「設定」をクリックします。 3. 開いたウィンドウインターフェイスで、左側の列の「言語」をクリックします

Microsoft Edge で表示されるダウンロード ボタンを設定する場所をご存知ですか? 以下では、エディターが Microsoft Edge で表示されるダウンロード ボタンを設定する方法を説明します。お役に立てば幸いです。エディターに従って学習しましょうステップ 1: まず、Microsoft Edge ブラウザを開き、下の図に示すように、右上隅にある [...] ロゴをクリックします。ステップ 2: 次の図に示すように、ポップアップ メニューで [設定] をクリックします。ステップ 3: 次に、次の図に示すように、インターフェイスの左側にある [外観] をクリックします。ステップ 4: 最後に、[ダウンロード ボタンを表示] の右側にあるボタンをクリックすると、下図に示すように、灰色から青色に変わります。上記は、エディターが Microsoft Edge でダウンロード ボタンを設定する方法を説明する場所です。

PyInstaller は、開発者が Python コードをプラットフォームに依存しない自己完結型の実行可能ファイル (.exe または .app) にコンパイルできるオープン ソース ライブラリです。これは、Python コード、依存関係、およびサポート ファイルをまとめてパッケージ化し、Python インタープリターをインストールせずに実行できるスタンドアロン アプリケーションを作成することによって実現されます。 PyInstaller の利点は、Python 環境への依存関係がなくなり、アプリケーションを簡単に配布してエンド ユーザーにデプロイできることです。また、ユーザーがアプリケーションの設定、アイコン、リソース ファイル、環境変数をカスタマイズできるビルダー モードも提供します。 PyInstaller を使用して PyInstal をインストールし、Python コードをパッケージ化する

PyInstaller は、元のスクリプト形式を超えて Python アプリケーションを強化する革新的なツールです。 Python コードをスタンドアロンの実行可能ファイルにコンパイルすることにより、PyInstaller はコードの配布、展開、およびメンテナンスの新しい領域を解放します。単一のスクリプトから強力なアプリケーションへ これまで、Python スクリプトは特定の Python 環境にのみ存在していました。このようなスクリプトを配布するには、ユーザーが Python と必要なライブラリをインストールする必要がありますが、これは時間がかかり面倒なプロセスです。 PyInstaller では、Python コードと必要なすべての依存関係を単一の実行可能ファイルに結合する、パッケージ化の概念が導入されています。 PyInstaller の作業をパッケージ化するコードの芸術

「彩られた時空の旅人」は2月29日にアップデート決定 アインと一緒に野外音楽祭に参加するとアインとの好感度ボーナスが獲得できる 3月4日には「残響の休日カラータイム」イベントが開始. 、プレイヤーは休暇の旅程レベルをアップグレードして、新しいテキスト メッセージやロフター コンテンツのロックを解除できます。時空の旅人アインの日常 永久コンテンツアップデート 2月29日バージョン以降、新キャンパススケジュール【野外音楽祭参加】を体験でき、アインと一緒に参加すると好感度ボーナスが獲得可能。 3月4日9:30から4月15日05:00まで、「長期休暇・セクシータイム」イベント期間中に、[ホリデー旅程]レベルをレベル8とレベル28にアップグレードすると、それぞれ新しいテキストメッセージとロフターコンテンツのロックが解除されます。 *新しいSMSとロフターが追加されました

出典:Shenchao TechFlow Solanaエコシステムの注目度の高い新興プロジェクトとして、Jupiterは、立ち上げから間もないにもかかわらず、DeFi分野で急速に台頭してきました。しかし、このような急速に発展する環境においても、経済モデルの改善とトークン価格の安定は依然として重要です。これらのサポートがなければ、プロジェクトは容易に悪循環に陥り、最終的には衰退したり、プロジェクト自体を維持できなくなったりする可能性があります。したがって、Jupiter は、プロジェクトの長期的な発展と成功を確実にするために、経済設計を継続的に最適化し、トークン価格の安定を確保する必要があります。 Solana チェーンは過去 1 週間で好調なパフォーマンスを示し、そのトークン SOL が流通市場で急速に上昇し、Jupiter のトークン $JUP も過去 2 週間で上昇しました。
