vue でのスロットとスロットスコープの使用手順の詳細な説明

php中世界最好的语言
リリース: 2018-04-13 10:36:39
オリジナル
1532 人が閲覧しました

今回は、Vueでslotとslot-scopeを使用する手順について詳しく説明します。Vueでslotとslot-scopeを使用する場合の注意事項について、実際のケースを見てみましょう。

この記事では、vue でのスロットとスロットスコープの具体的な使い方のチュートリアルを紹介しますので、必要な方はぜひご覧ください

前に書いてください

Vue のスロットに関するドキュメントの説明は非常に短く、言語は非常に簡潔です。また、メソッド、データ、計算などの一般的なオプションの使用頻度と順序に違いがあるため、問題が発生する可能性があります。最初 スロットに触れる開発者は、「忘れて、後で学習すれば、基本的なコンポーネントはすでに書けるから」という傾向があり、Vue ドキュメントを閉じてしまいます。

実際、スロットの概念は非常に単純で、以下の 3 つの部分に分かれています。この部分も vue ドキュメントの順序で書かれています。

3 番目のパートに入る前に、スロットに慣れていない生徒に、スロットとは何かという簡単な概念を理解してもらいます。スロット (スロットとも呼ばれる) はコンポーネントの HTML テンプレートであり、このテンプレートが表示されるかどうか、およびその方法について説明します。それを表示する 表示は親コンポーネントによって決まります。 実際、ここでは、スロットを表示するかどうかと、どのように表示するかという、スロットの 2 つの中心的な問題が強調されています。

スロットはテンプレートであるため、実際には、テンプレート タイプの観点から、コンポーネントは非スロット テンプレートとスロット テンプレートの 2 つのカテゴリに分類できます。

非スロット テンプレートは、「p、span、ul、table」などを参照する html テンプレートを指します。非スロット テンプレートの表示と非表示、およびそれらの表示方法は、プラグイン自体によって制御されます。はスロット、つまり空きスペースです。 シェル。その表示と非表示、および最終的にどのような HTML テンプレートが表示されるかは、親コンポーネントによって制御されるためです。ただし、スロット表示の位置は実際にはサブコンポーネント自体によって決定され、スロットがコンポーネント テンプレートに記述されている場合、親コンポーネントはそれを渡します。 テンプレートは今後表示される予定です。

単一スロット | 匿名スロット

1 つ目はシングル スロットです。シングル スロットは Vue の正式名ですが、実際にはデフォルト スロット、または名前付きスロットとは対照的に匿名スロットと呼ぶこともできます。 name属性を設定する必要がないからです。

単一のスロットはコンポーネント内のどこにでも配置できますが、その名前が示すように、コンポーネント内にこのタイプのスロットは 1 つだけ存在できます。同様に、名前 (name 属性) が続く限り、多数の名前付きスロットが存在する可能性があります。 性別)は違います。

これについては、以下の例で説明します。

親コンポーネント:

<template>
 <p class="father">
  <h3>这里是父组件</h3>
  <child>
   <p class="tmpl">
    <span>菜单1</span>
    <span>菜单2</span>
    <span>菜单3</span>
    <span>菜单4</span>
    <span>菜单5</span>
    <span>菜单6</span>
   </p>
  </child>
 </p>
</template>
ログイン後にコピー

サブコンポーネント:

rreee

この例では、親コンポーネントの HTML テンプレートが で記述されているため、子コンポーネントの匿名スロットのテンプレートは次のようになります。言い換えれば、サブコンポーネントの匿名挿入 スロットは以下のテンプレートで使用されます。

りー

注: すべてのデモは、見やすくするためにスタイルが変更されています。このうち、親コンポーネントは灰色の背景で塗りつぶされ、子コンポーネントは水色の背景で塗りつぶされます。

名前付きスロット

匿名スロットには name 属性がないため、name 属性が追加されると名前付きスロットになります。名前付きスロットはコンポーネント内に N 回出現できます。さまざまな場所に出現します。下に 例としては、2 つの名前付きスロットと 1 つのスロットを持つコンポーネントが挙げられます。これら 3 つのスロットは、同じ CSS スタイルのセットを使用して親コンポーネントによって表示されますが、内容は若干異なります。

親コンポーネント:

<template>
 <p class="child">
  <h3>这里是子组件</h3>
  <slot></slot>
 </p>
</template>
ログイン後にコピー

サブコンポーネント:

rreee

ご覧のとおり、親コンポーネントは、HTML テンプレートのスロット属性を通じて名前付きスロットに関連付けられています。スロット属性のない HTML テンプレートは、デフォルトで匿名スロットに関連付けられます。

データを含むスコープスロット

最後に、スコープ スロットがあります。これは少し理解するのが難しいです。正式にはスコープ スロットと呼ばれますが、実際には、前の 2 つのスロットと比較すると、データ付きスロットと呼ぶことができます。それはどういう意味ですか? 最初の 2 つはコンポーネントのテンプレートに書かれています

匿名スロット

<p class="tmpl">
 <span>菜单1</span>
 <span>菜单2</span>
 <span>菜单3</span>
 <span>菜单4</span>
 <span>菜单5</span>
 <span>菜单6</span>
</p>
ログイン後にコピー

名前付きスロット

<template>
 <p class="father">
 <h3>这里是父组件</h3>
 <child>
  <p class="tmpl" slot="up">
  <span>菜单1</span>
  <span>菜单2</span>
  <span>菜单3</span>
  <span>菜单4</span>
  <span>菜单5</span>
  <span>菜单6</span>
  </p>
  <p class="tmpl" slot="down">
  <span>菜单-1</span>
  <span>菜单-2</span>
  <span>菜单-3</span>
  <span>菜单-4</span>
  <span>菜单-5</span>
  <span>菜单-6</span>
  </p>
  <p class="tmpl">
  <span>菜单->1</span>
  <span>菜单->2</span>
  <span>菜单->3</span>
  <span>菜单->4</span>
  <span>菜单->5</span>
  <span>菜单->6</span>
  </p>
 </child>
 </p>
</template>
ログイン後にコピー

ただし、スコープ スロットでは、スロット上にデータをバインドする必要があります。つまり、大まかに以下のように書く必要があります。

<slot name="up" :data="data"></slot>
 export default {
 data: function(){
  return {
  data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
  }
 },
}
ログイン後にコピー

我们前面说了,插槽最后显示不显示是看父组件有没有在child下面写模板,像下面那样。

<child>
 html模板
</child>
ログイン後にコピー

写了,插槽就总得在浏览器上显示点东西,东西就是html该有的模样,没写,插槽就是空壳子,啥都没有。
OK,我们说有html模板的情况,就是父组件会往子组件插模板的情况,那到底插一套什么样的样式呢,这由父组件的html+css共同决定,但是这套样式里面的内容呢 ?

正因为作用域插槽绑定了一套数据,父组件可以拿来用。于是,情况就变成了这样:样式父组件说了算,但内容可以显示子组件插槽绑定的。

我们再来对比,作用域插槽和单个插槽和具名插槽的区别,因为单个插槽和具名插槽不绑定数据,所以父组件是提供的模板要既包括样式由包括内容的,上 面的例子中,你看到的文字,“菜单1”,“菜单2”都是父组件自己提供的内容;而作用域插槽,父组件只需要提供一套样式(在确实用作用域插槽绑定的数据的前 提下)。

下面的例子,你就能看到,父组件提供了三种样式(分别是flex、ul、直接显示),都没有提供数据,数据使用的都是子组件插槽自己绑定的那个人名数组

父组件:

<template>
 <p class="father">
 <h3>这里是父组件</h3>
 <!--第一次使用:用flex展示数据-->
 <child>
  <template slot-scope="user">
  <p class="tmpl">
   <span v-for="item in user.data">{{item}}</span>
  </p>
  </template>
 </child>
 <!--第二次使用:用列表展示数据-->
 <child>
  <template slot-scope="user">
  <ul>
   <li v-for="item in user.data">{{item}}</li>
  </ul>
  </template>
 </child>
 <!--第三次使用:直接显示数据-->
 <child>
  <template slot-scope="user">
  {{user.data}}
  </template>
 </child>
 <!--第四次使用:不使用其提供的数据, 作用域插槽退变成匿名插槽-->
 <child>
  我就是模板
 </child>
 </p>
</template>
ログイン後にコピー

子组件:

<template>
 <p class="child">
 <h3>这里是子组件</h3>
 // 作用域插槽
 <slot :data="data"></slot>
 </p>
</template>
 export default {
 data: function(){
  return {
  data: ['zhangsan','lisi','wanwu','zhaoliu','tianqi','xiaoba']
  }
 }
}
ログイン後にコピー

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

vue实现购物车的小球抛物线效果详解

AngularJS1.x应用怎么迁移至React

以上がvue でのスロットとスロットスコープの使用手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート