vue スロットによって解決される問題: 導入されたサブコンポーネント タグの途中にコンテンツを書き込むことはできません。スロットは、コンポーネント パッケージャ用に Vue によって提供される機能です。開発者は、コンポーネントをパッケージ化するときに、ユーザーがスロットとして指定すると予想される不確実な部分を定義できます。スロットは、コンポーネントのパッケージ化中と見なすことができます。ユーザー用に予約されたコンテンツのプレースホルダー。
#スロットとは何ですか? vue では、導入されたサブコンポーネント タグの途中にコンテンツを記述することはできないことがわかっています。この問題を解決するために、公式はスロットの概念を導入しました。
スロットは実際にはプレースホルダーと同等です。これにより、コンポーネント内で HTML テンプレートに場所が与えられ、いくつかのものを渡すことができるようになります。スロットは、
匿名スロット、名前付きスロット、およびスコープ付きスロットに分割されます。 なぜ HTML をサブコンポーネントに直接記述するのではなく、サブコンポーネントに渡す必要があるのかよく理解できないかもしれません。答えはこれです。 5 ページあるシナリオを想像してみてください。5 ページのうち 1 つの領域だけが異なるコンテンツを持っています。この 5 ページはどのように書きますか?コピー アンド ペーストも 1 つの方法ですが、vue ではスロットの方が優れています。
##匿名スロット匿名スロット。単一スロット スロットまたはデフォルトと呼ぶことができます。スロット。名前付きスロットとは異なり、name 属性を設定する必要はありません。 (隠れた name 属性がデフォルトです。)
例:
ファイルディレクトリは次のとおりで、Home コンポーネントが HelloWorld の親コンポーネントです。
HelloWorld に匿名スロットを作成します
<template> <div> Helloworld组件 <div> <slot></slot> </div> </div> </template> <script> export default { } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style> .hello{ width:100%; height:300px; background:#ccc; margin-top:50px; .slotTxt{ width:500px; height:200px; margin:30px auto; background:red; } } </style>
<template> <div> 我是Home父组件 <helloworld> <!-- 没有插槽,这里的内容不显示 --> <h1 id="我是helloworld中的插槽啊">我是helloworld中的插槽啊</h1> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script>
- Effect
前述したように、スロットには名前属性があります。匿名スロットとは対照的に、name 属性が追加された匿名スロットは名前付きスロットです。
HelloWorld コンポーネントに name 属性が left と right のスロットをそれぞれ書き込みます
<template> <div> Helloworld组件 <div> <slot></slot> </div> <div> <slot></slot> </div> </div> </template> <script> export default { } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style> .hello{ width:700px; height:300px; background:#ccc; margin: 0 auto; margin-top:50px; .slotLeft{ width:300px; height:200px; float:left; background:red; } .slotRight{ width:300px; height:200px; float:right; background:pink; } } </style>
- Home コンポーネントはテンプレートに v-slot:name を書き込みnamed を使用しますスロット
<template> <div> 我是Home父组件 <helloworld> <template> <h1 id="name属性为left">name属性为left</h1> </template> <template> <h1 id="name属性为right">name属性为right</h1> </template> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script> <style> .home{ width:900px; margin:0 auto; background:yellow; padding-bottom:100px; } </style>
- v-slot はテンプレート タグにのみ追加できることに注意してください (1 つの例外を除く)。
#影響
- ##例外 (放棄されたスロット='名前')
<template> <div> 我是Home父组件 <helloworld> <h1 id="name属性为left">name属性为left</h1> <h1 id="name属性为right">name属性为right</h1> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script> <style> .home{ width:900px; margin:0 auto; background:yellow; padding-bottom:100px; } </style>効果は上記と同じです。
-
名前付きスロットに関するほとんどの知識 v-on や v-bind と同様、v-slot にも省略形があります。つまり、パラメーター (v-slot:) より前のすべてを文字に置き換えます。 #。たとえば、v-slot:header は #header に書き換えることができます。
- #スコープ スロット
スコープ スロットは、実際にはデータを渡すことができるスロットです。子コンポーネント内の一部のデータを親コンポーネントで使用する場合は、指定されたメソッドを介してデータを渡す必要があります。公式ドキュメントでは、**親テンプレート内のすべてのコンテンツが親スコープでコンパイルされるというルールが提案されています。子テンプレート内のすべては子スコープでコンパイルされます。 **子コンポーネントの値を親コンポーネントで直接使用すると、エラーが報告されます。 匿名スロットのスコープ スロット
子コンポーネントのデータを親のスロット コンテンツで利用できるようにするには、そのデータを要素の A プロパティとして使用できます。バインドされています:
语法:v-bind:users="user"
サブコンポーネント HelloWorld コード
<template> <div> Helloworld组件 <div> <slot></slot> </div> </div> </template> <script> export default { data(){ return{ user:{ name:'oralinge', age:18 } } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style> .hello{ width:700px; height:300px; background:#ccc; margin: 0 auto; margin-top:50px; .slotLeft{ width:300px; height:200px; // float:left; background:red; margin:20px auto } .slotRight{ width:300px; height:200px; float:right; background:pink; } } </style>要素 (v-bind:users="user") にバインドされたプロパティが、スロット プロパティに対して呼び出されます。これで、親スコープで、v-slot を値とともに使用して、提供するスロット プロパティの名前を定義できるようになりました。
语法:v-slot:default="随意取的名字" // default可省略,简写为v-slot="随意取的名字"
- 親コンポーネントのホームコード
<template> <div> 我是Home父组件 <helloworld> <template> <h1 id="slotProps-users-name">{{slotProps.users.name}}</h1> </template> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script> <style> .home{ width:900px; margin:0 auto; background:yellow; padding-bottom:100px; } </style>注:
親コンポーネントのslotPropsは自由に取得できます。
サブコンポーネントのユーザーは、親コンポーネントのユーザーに対応して、任意に選択されます。- サブコンポーネント内のユーザーはデータです。
- 効果
匿名スロットと同じ、自分だけデフォルトをスロットの名前の値に置き換える必要があります。
サブコンポーネント HelloWorld コード
<template> <div> Helloworld组件 <div> <slot></slot> </div> </div> </template> <script> export default { data(){ return{ user:{ name:'hello world', age:18 } } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style> .hello{ width:700px; height:300px; background:#ccc; margin: 0 auto; margin-top:50px; .slotLeft{ width:300px; height:200px; // float:left; background:red; margin:20px auto } .slotRight{ width:300px; height:200px; float:right; background:pink; } } </style>
親コンポーネント ホームコード
<template> <div> 我是Home父组件 <helloworld> <template> <h1 id="slotProps-users-name">{{slotProps.users.name}}</h1> </template> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script> <style> .home{ width:900px; margin:0 auto; background:yellow; padding-bottom:100px; } </style>
注意:
默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确。
另,slot-scope写法在2.6之后已废弃,作用与上面相同,在此不做解释。
上面的写法是不是觉得有些麻烦?别着急,我们来看一看解构插槽 Prop。
解构插槽 Prop
作用域插槽的内部工作原理是将你的插槽内容包括在一个传入单个参数的函数里:
function (slotProps) { // 插槽内容 }
这意味着 v-slot 的值实际上可以是任何能够作为函数定义中的参数的 JavaScript 表达式。所以在支持的环境下 (单文件组件或现代浏览器),你也可以使用 ES2015 解构来传入具体的插槽 prop。
语法:v-slot="{ users }"
- HelloWold组件
<template> <div> Helloworld组件 <div> <slot></slot> </div> </div> </template> <script> export default { data(){ return{ user:{ name:'hello world', age:18 } } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style> .hello{ width:700px; height:300px; background:#ccc; margin: 0 auto; margin-top:50px; .slotLeft{ width:300px; height:200px; // float:left; background:red; margin:20px auto } .slotRight{ width:300px; height:200px; float:right; background:pink; } } </style>
- Home组件
<template> <div> 我是Home父组件 <helloworld> <template> <h1 id="users-name">{{users.name}}</h1> </template> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script> <style> .home{ width:900px; margin:0 auto; background:yellow; padding-bottom:100px; } </style>
效果
- 重命名----更改users这个名字
<template> <div> 我是Home父组件 <helloworld> <template> <h1 id="person-name">{{person.name}}</h1> </template> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script> <style> .home{ width:900px; margin:0 auto; background:yellow; padding-bottom:100px; } </style>
效果如上图。
- 定义后备内容,用于插槽 prop 是 undefined 的情形
此处按照官方文档的写法会出现语法报错,后期应该会修复(有知道的麻烦通知一声)。
<template> <div> 我是Home父组件 <helloworld> <template> <h1 id="users-name">{{users.name}}</h1> </template> </helloworld> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' export default { name: 'home', components: { HelloWorld } } </script> <style> .home{ width:900px; margin:0 auto; background:yellow; padding-bottom:100px; } </style>
使用场景
- 复用公共组件
代码示例如下:
<template> <div> <div> <span>{{title}}</span> <div> <slot></slot> </div> </div> <div> <slot></slot> </div> </div> </template> <script> export default { data () { return { } }, props: { title: { type: String, required: true } } } </script> <style> .title-box { padding: 16px 0; border-bottom: 1px solid #eff1f5; .title { font-family: MicrosoftYaHei; font-size: 24px; color: #283039; letter-spacing: 0; line-height: 24px; &::before { width: 4px; margin-right: 20px; content: ""; background-color: #5da1ff; display: inline-block; height: 20px; vertical-align: middle; } } .right { float: right; margin-right: 20px; } } </style>
使用的ui框架为ivew。
相关推荐:vue.js视频教程
以上がvue スロットはどのような問題を解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Reactは、ユーザーインターフェイスを構築するためのフロントエンドフレームワークです。バックエンドフレームワークは、サーバー側のアプリケーションを構築するために使用されます。 Reactはコンポーネントで効率的なUIアップデートを提供し、バックエンドフレームワークは完全なバックエンドサービスソリューションを提供します。テクノロジースタックを選択するときは、プロジェクトの要件、チームのスキル、およびスケーラビリティを考慮する必要があります。

HTMLとReactの関係は、フロントエンド開発の中核であり、最新のWebアプリケーションのユーザーインターフェイスを共同で構築します。 1)HTMLはコンテンツ構造とセマンティクスを定義し、Reactはコンポーネントを介して動的インターフェイスを構築します。 2)ReactコンポーネントはJSX構文を使用してHTMLを埋め込み、インテリジェントなレンダリングを実現します。 3)コンポーネントライフサイクルは、状態および属性に従ってHTMLレンダリングと動的に更新を管理します。 4)コンポーネントを使用して、HTML構造を最適化し、保守性を向上させます。 5)パフォーマンスの最適化には、不必要なレンダリングの回避、重要な属性の使用、およびコンポーネントの単一の責任を維持することが含まれます。

Reactは、インタラクティブなフロントエンドエクスペリエンスを構築するための好ましいツールです。 1)Reactは、コンポーネント化と仮想DOMを通じてUIの開発を簡素化します。 2)コンポーネントは、関数コンポーネントとクラスコンポーネントに分割されます。関数コンポーネントはよりシンプルで、クラスコンポーネントはより多くのライフサイクル方法を提供します。 3)Reactの作業原則は、パフォーマンスを改善するために仮想DOMおよび調整アルゴリズムに依存しています。 4)国家管理は、usestateまたはthis.stateを使用し、ComponentDidmountなどのライフサイクルメソッドが特定のロジックに使用されます。 5)基本的な使用には、コンポーネントの作成と状態の管理が含まれ、高度な使用にはカスタムフックとパフォーマンスの最適化が含まれます。 6)一般的なエラーには、不適切なステータスの更新とパフォーマンスの問題が含まれます。

Reactは、コアコンポーネントと状態管理を備えたユーザーインターフェイスを構築するためのJavaScriptライブラリです。 1)コンポーネントと州の管理を通じてUIの開発を簡素化します。 2)作業原則には和解とレンダリングが含まれ、React.memoとusememoを通じて最適化を実装できます。 3)基本的な使用法は、コンポーネントを作成およびレンダリングすることであり、高度な使用法にはフックとコンテキストアピの使用が含まれます。 4)不適切なステータスの更新などの一般的なエラーでは、ReactDevtoolsを使用してデバッグできます。 5)パフォーマンスの最適化には、React.MEMO、仮想化リスト、コードスプリッティの使用が含まれ、コードを読みやすく保守可能に保つことがベストプラクティスです。

ReactはJSXとHTMLを組み合わせてユーザーエクスペリエンスを向上させます。 1)JSXはHTMLを埋め込み、開発をより直感的にします。 2)仮想DOMメカニズムは、パフォーマンスを最適化し、DOM操作を削減します。 3)保守性を向上させるコンポーネントベースの管理UI。 4)国家管理とイベント処理は、インタラクティブ性を高めます。

Reactコンポーネントは、機能またはクラスによって定義され、UIロジックのカプセル化、およびプロップを介して入力データを受け入れることができます。 1)コンポーネントの定義:関数またはクラスを使用して、反応要素を返します。 2)レンダリングコンポーネント:Reactコールレンダリングメソッドまたは機能コンポーネントを実行します。 3)マルチプレックスコンポーネント:データをプロップに渡して、複雑なUIを構築します。コンポーネントのライフサイクルアプローチにより、ロジックをさまざまな段階で実行でき、開発効率とコードメンテナビリティが向上します。

React Strictモードは、追加のチェックと警告をアクティブにすることにより、Reactアプリケーションの潜在的な問題を強調する開発ツールです。これは、レガシーコード、安全でないライフサイクル、および副作用を特定するのに役立ち、現代の反応の実践を促進します。

反応フラグメントにより、余分なDOMノードなしで子供をグループ化すること、構造、パフォーマンス、アクセシビリティが向上します。それらは、効率的なリストレンダリングの鍵をサポートしています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

WebStorm Mac版
便利なJavaScript開発ツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。
