Vue の非レンダリング動作スロットの詳細な説明
この記事では、Vue のレンダリングレス スロット モードがどのような問題の解決に役立つかについて説明します。
Vue.js 2.3.0 で導入されたスコープ付きスロットにより、コンポーネントの再利用性が大幅に向上します。レンダリングレス コンポーネント パターンは、再利用可能な動作とプラグイン可能な表現を提供するという問題を解決するために登場しました。
ここでは、逆の問題、つまり再利用可能な外観とプラグ可能な動作を提供する方法を解決する方法を見ていきます。
レンダリングレス コンポーネント
このパターンは、複雑な動作を実装し、プレゼンテーションをカスタマイズできるコンポーネントに適しています。
これは次の機能を満たします:
- このコンポーネントはすべての動作を実装します
- スコープのスロットはレンダリングを担当します
- フォールバック コンテンツは次のことを保証します。コンポーネントが直接使用できること。
例: Ajax リクエストを実行し、スロットの結果を表示するコンポーネント。このコンポーネントは Ajax リクエストを処理して状態を読み込み、デフォルトのスロットがプレゼンテーションを提供します。
これは実装の簡略化されたバージョンです:
<template> <div> <slot v-if="loading" name="loading"> <div>Loading ...</div> </slot> <slot v-else v-bind={data}> </slot> </div> </template> <script> export default { props: ["url"], data: () => ({ loading: true, data: null }), async created() { this.data = await fetch(this.url); this.loading = false; } }; </script>
使用法:
<lazy-loading url="https://server/api/data"> <template #default="{ data }"> <div>{{ data }}</div> </template> </lazy-loading>
このパターンに関する元の記事については、ここでご覧ください。
反対の質問
問題が逆だったらどうなるでしょうか: コンポーネントの主な機能がその表現であり、さらにその動作がカスタマイズ可能である必要がある場合を想像してください。
以下に示すように、SVG に基づいてツリー コンポーネントを作成するとします。
SVG の表示と動作を提供したいとします。クリックしたときと同様 ノードを撤回してテキストを強調表示するとき。
問題は、これらの動作をハードコーディングせず、コンポーネントのユーザーが自由にオーバーライドできるようにする場合に発生します。
これらの動作を公開する簡単な解決策は、コンポーネントにメソッドとイベントを追加することです。
次のように実装できます:
<script> export default { mounted() { // pseudo code nodes.on('click',(node) => this.$emit('click', node)); }, methods: { expandNode(node) { //... }, retractNode(node) { //... }, highlightText(node) { //... }, } }; </script>
コンポーネントのユーザーがコンポーネントに動作を追加したい場合は、親コンポーネントで ref を使用する必要があります。例:
<template> <tree ref="tree" @click="onClick"></tree> </template> <script> export default { methods: { onClick(node) { this.$refs.tree.retractNode(node); } } }; </script>
This この方法にはいくつかの欠点があります。
- デフォルトの動作は提供できなくなりました
- 動作コードは頻繁にコピーして貼り付けることになります
- 動作は再利用できません
レンダリングレス スロットがこれらの問題をどのように解決するかを見てみましょう。
レンダリングレス スロット
行動は基本的に、イベントに対する反応を示すことで構成されます。それでは、イベントとコンポーネント メソッドへのアクセスを受け取るスロットを作成しましょう。
<template> <div> <slot name="behavior" :on="on" :actions="actions"> </slot> </div> </template> <script> export default { methods: { expandNode(node) { }, retractNode(node) { }, //... }, computed:{ actions() { const {expandNode, retractNode} = this; return {expandNode, retractNode}; }, on() { return this.$on.bind(this); } } }; </script>
on
プロパティは親コンポーネントの $on
メソッドなので、すべて聞いてください。イベント。
この動作は、レンダリングレス コンポーネントとして実装できます。次に、クリック拡張コンポーネントを作成します:
export default { props: ['on','action'] render: () => null, created() { this.on("click", (node) => { this.actions.expandNode(node); }); } };
使用法:
<tree> <template #behavior="{ on, actions }"> <expand-on-click v-bind="{ on, actions }"/> </template> </tree>
このソリューションの主な利点は次のとおりです:
- 代替コンテンツを通じてデフォルトの動作を提供できる可能性:
たとえば、グラフィカル コンポーネントを次のように宣言することで、
<template> <div> <slot name="behavior" :on="on" :actions="actions"> <expand-on-click v-bind="{ on, actions }"/> </slot> </div> </template>
- 再利用可能なコンポーネントを作成し、このコンポーネントのユーザーが選択できる標準の動作を実装できます
ホバー ハイライト コンポーネントを検討します:
export default { props: ['on','action'] render: () => null, created() { this.on("hover", (node) => { this.actions.highlight(node); }); } };
標準の動作をオーバーライドします:
<tree> <template #behavior="{ on, actions }"> <highlight-on-hover v-bind="{ on, actions }"/> </template> </tree>
- 動作スロットは構成可能です
Add 2 つの事前定義された動作:
<tree> <template #behavior="{ on, actions }"> <expand-on-click v-bind="{ on, actions }"/> <highlight-on-hover v-bind="{ on, actions }"/> </template> </tree>
- ソリューションの読みやすさ
動作であるコンポーネントは自己記述的です。
- Extensibility
on
プロパティは、すべてのコンポーネント イベントにアクセスできます。デフォルトでは、このスロットでは新しいイベントが利用可能です。
概要
レンダリングレス スロットは、コンポーネント内のメソッドとイベントを公開するための興味深いソリューションを提供します。より読みやすく再利用可能なコードが提供されます。
このモードを実装するツリー コンポーネントのコードは、github にあります: Vue.D3.tree
元の英語アドレス: https:// alligator.io/vuejs/renderless-behavior-slots/
著者: David Desmaisons
関連する推奨事項:
詳細 プログラミング関連の知識については、プログラミング入門をご覧ください。 !
以上がVue の非レンダリング動作スロットの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









HTMLテンプレートのボタンをメソッドにバインドすることにより、VUEボタンに関数を追加できます。 VUEインスタンスでメソッドを定義し、関数ロジックを書き込みます。

vue.jsでBootstrapを使用すると、5つのステップに分かれています。ブートストラップをインストールします。 main.jsにブートストラップをインポートしますブートストラップコンポーネントをテンプレートで直接使用します。オプション:カスタムスタイル。オプション:プラグインを使用します。

vue.jsでJSファイルを参照するには3つの方法があります。タグ;; mounted()ライフサイクルフックを使用した動的インポート。 Vuex State Management Libraryを介してインポートします。

Vue.jsの監視オプションにより、開発者は特定のデータの変更をリッスンできます。データが変更されたら、Watchはコールバック関数をトリガーして更新ビューまたはその他のタスクを実行します。その構成オプションには、すぐにコールバックを実行するかどうかを指定する即時と、オブジェクトまたは配列の変更を再帰的に聴くかどうかを指定するDEEPが含まれます。

VUEマルチページ開発は、VUE.JSフレームワークを使用してアプリケーションを構築する方法です。アプリケーションは別々のページに分割されます。コードメンテナンス:アプリケーションを複数のページに分割すると、コードの管理とメンテナンスが容易になります。モジュール性:各ページは、簡単に再利用および交換するための別のモジュールとして使用できます。簡単なルーティング:ページ間のナビゲーションは、単純なルーティング構成を介して管理できます。 SEOの最適化:各ページには独自のURLがあり、SEOに役立ちます。

vue.jsには、前のページに戻る4つの方法があります。$ router.go(-1)$ router.back()outes&lt; router-link to =&quot;/&quot; Component Window.history.back()、およびメソッド選択はシーンに依存します。

Vue Devtoolsを使用してブラウザのコンソールでVueタブを表示することにより、Vueバージョンを照会できます。 NPMを使用して、「NPM List -G Vue」コマンドを実行します。 package.jsonファイルの「依存関係」オブジェクトでVueアイテムを見つけます。 Vue CLIプロジェクトの場合、「Vue -Version」コマンドを実行します。 &lt; script&gt;でバージョン情報を確認してくださいVueファイルを参照するHTMLファイルにタグを付けます。

VUEの関数傍受は、指定された期間内に関数が呼び出され、パフォーマンスの問題を防ぐ回数を制限するために使用される手法です。実装方法は次のとおりです。LodashLibrary:Import {Debounce}から「Lodash」からインポート。 debounce関数を使用して、インターセプト関数を作成します。インターセプト関数を呼び出すと、制御関数は500ミリ秒でせいぜい1回呼び出されます。
