gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

一起聊聊Web Components之Slots(實例詳解)

本篇文章給大家帶來了關于Slots的相關知識,Slots 的作用就是給模板元素傳值,增強模板元素的靈活性和通用性,希望對大家有幫助。

一起聊聊Web Components之Slots(實例詳解)

熟悉 Vue 的同學應該都知道”插槽(slot)“的概念,通過使用插槽可以讓頁面內容的組織更加靈活。

在 Web Components 體系中也有插槽的概念,今天我們就來具體了解一下 Slots,本文主要包括以下內容:

  • 為什么要用 Slots ?
  • Slots 的相關特性

Slots 的作用

我們首先來看一個模板元素:

<template>     <p class = "header">MY CARD</p>     <p class="details">         My name is 編程三昧。    </p></template>

既然是模板,那就意味著在很多地方都會使用到它,但是,這里會存在一個問題:所有使用這個模板的地方都將顯示模板中的內容,即并不是所有人的名字都叫 ”編程三昧“。

在這種情況下,叫其他名字的人是沒法使用這個模板的,顯然,這就和使用模板的初衷相違背了,這個模板的使用范圍太過狹小,不存在通用性。

想要使得這個模板具有通用性,其關鍵點在于 .details 中顯示的內容是否具有通用性。

開動腦筋想一想,我們是不是可以將其中的”編程三昧“設為動態內容,誰使用這個模板,誰就傳入自己的名字。恰好, Slots(插槽)就可以實現這種效果,具體如下:

<!--在模板中使用 slot 進行占位--><template id="cardTmp">     <p class="header">MY CARD</p>     <p class="details">         My name is <slot name="userName">編程三昧</slot>。    </p></template><!--在使用上面模板的自定義元素中給 slot 傳值--><my-card>     <span slot="userName">插槽傳值</slot></my-card><my-card>     <span slot="userName">web Components</slot></my-card>

其對應的 JS 代碼如下:

class MyCard extends HTMLElement {     constructor () {         super();         const template = document.getElementById('cardTmp');         const templateContent = template.content;          this.attachShadow({mode: 'open'}).appendChild(             templateContent.cloneNode(true)         );     }}customElements.define('my-card', MyCard);

實現效果:

一起聊聊Web Components之Slots(實例詳解)

通過上面的例子,我們可以用一句話總結 Slots 的作用:Slots 的作用就是給模板元素傳值,增強模板元素的靈活性和通用性。

Slots 的相關特性

對于 Slots 的相關特性,我通過問答的形式逐一解釋。

Slots 的 name 屬性有什么作用?

帶有指定 name 的 Slots 被稱為 ”具名插槽“,name 是 slot 的唯一標識。

在引入插槽內容的元素上需要使用與 Slots.name 值相同的 slot 屬性。看下面的代碼:

<template id="cardTmp">     <p class="header">MY CARD</p>     <p class="details">         My name is <slot name="userAge">19</slot>。    </p></template><my-card>     <span slot="userName">編程三昧</slot></my-card><my-card>     <span slot="userName">web Components</slot></my-card><script>     class MyCard extends HTMLElement {         constructor () {             super();             const template = document.getElementById('cardTmp');             const templateContent = template.content;              this.attachShadow({mode: 'open'}).appendChild(                 templateContent.cloneNode(true)             );         }     }     customElements.define('my-card', MyCard);</script>

運行效果:

一起聊聊Web Components之Slots(實例詳解)

因為傳入的 slot 屬性值和 Slots 的 name 屬性值對不上,所以 Slots 未被插入。

傳值時的 slot 屬性值必須和 Slots 的 name 屬性值保持一致。

不給 Slots 傳值會怎樣?

將上面兩個自定義元素 my-card 中的 span 元素去掉,不傳任何值,即改成這樣:

<my-card></my-card>

運行后的效果:

一起聊聊Web Components之Slots(實例詳解)

可以看到,如果不給 Slots 傳值,那么 Slots 會顯示它自己預設的內容

其實結合以上兩點,還可以得出一個結論:如果有引用 Slots ,那只有對應 name 的 Slots 內容會被顯示,其余的 Slots 皆不顯示

正常 DOM 中可以使用 Slots 嗎?

這里的”正常 DOM“ 是相對于 Shadow DOM 來說的,指的是頁面所在的文檔對象。

代碼如下:

<slot name="userName">Slots 預設值</slot><p slot="userName">bcsm</p>

顯示如下:

一起聊聊Web Components之Slots(實例詳解)

總結:正常 DOM 中使用 Slots,它會直接渲染在頁面上,切不具備插槽效果

Slots 是不是必須用在 Templates 中?

我們前面看到的例子中,Slots 是在 Templates 中,那是不是意味著 Slots 必須要用在 Templates 中才能生效呢?

因為已經驗證過在正常 DOM 中的 Slots 是無效的,所以我們在 Shadow DOM 中做個測試,代碼如下:

<body>     <h1>不在 Templates 中使用 Slots</h1>     <p id="templ">         <slot name="userName">這是 Slots 預設值</slot>     </p>     <my-paragraph>         <span slot="userName">編程三昧</span>     </my-paragraph>     <script>         class MyParagraph extends HTMLElement {             constructor () {                 super();                 const template = document.getElementById('templ');                  this.attachShadow({mode: 'open'}).appendChild(                     template.cloneNode(true)                 );             }         }         customElements.define('my-paragraph', MyParagraph);     </script></body>

顯示效果如下:

一起聊聊Web Components之Slots(實例詳解)

從顯示效果上可以看到,將包含 Slots 的正常 DOM 節點在追加到 Shadow DOM 后,Slots 顯示傳入的值,也就是說 Slots 是生效了的。

總結:Slots 在 Shadow DOM 中就可生效,并非一定要用在 Templates 中

一個自定義元素中可以使用多個同名 Slots 嗎?

看代碼:

<template id="cardTmp">     <p class="header">MY CARD</p>     <p class="details">         My name is <slot name="userName">編程三昧</slot>。    </p></template><my-card>     <span slot="userName">插槽傳值1</span>     <span slot="userName">插槽傳值2</span></my-card><script>     class MyCard extends HTMLElement {         constructor () {             super();             const template = document.getElementById('cardTmp');             const templateContent = template.content;              this.attachShadow({mode: 'open'}).appendChild(                 templateContent.cloneNode(true)             );         }     }     customElements.define('my-card', MyCard);</script>

顯示效果:

一起聊聊Web Components之Slots(實例詳解)

結論:一個 Slots 可以接收多個傳入值,且都會解析顯示出來

Slots 的傳值元素必須是自定義元素的直接子元素嗎?

上面的例子中,所有給 Slots 傳值的元素都是自定義元素的子元素,那是不是非直接子元素不行呢?

代碼如下:

<template id="cardTmp">     <p class="header">MY CARD</p>     <p class="details">         My name is <slot name="userName">編程三昧</slot>。    </p></template><my-card>     <p>         <span slot="userName">插槽傳值1</span>     </p></my-card><script>     class MyCard extends HTMLElement {         constructor () {             super();             const template = document.getElementById('cardTmp');             const templateContent = template.content;              this.attachShadow({mode: 'open'}).appendChild(                 templateContent.cloneNode(true)             );         }     }     customElements.define('my-card', MyCard);</script>

運行效果(傳值失效):

一起聊聊Web Components之Slots(實例詳解)

結論:給 Slots 傳值的元素必須是自定義元素的直接子元素,否則傳值失效

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美三级理论片| 男人透女人免费视频| 依人在线免费视频| 成人免费无码av| 茄子视频成人免费观看| 2018中文字幕第一页| 亚洲精品国产suv一区88| 91精品国产毛片武则天| 熟妇熟女乱妇乱女网站| 特级西西444www| 91精产国品一二三产区别沈先生| 91插插插插插插插插| 亚洲理论中文字幕| 中文字幕55页| 日本阿v视频在线观看| 国产一二三在线视频| 黄色成人在线看| 逼特逼视频在线| 欧美黄色性生活| 婷婷激情小说网| www.xxx麻豆| 日韩在线一级片| 污污的视频免费| 国产夫妻自拍一区| 国产精品igao| 中文字幕第一页亚洲| 日本一级黄视频| 99免费视频观看| 91网址在线观看精品| 国产男女免费视频| 怡红院亚洲色图| 中文字幕日韩精品无码内射| 日本免费黄视频| 男女h黄动漫啪啪无遮挡软件| 韩国无码av片在线观看网站| 99福利在线观看| 亚洲无在线观看| 国产偷人视频免费| 成年人黄色在线观看| 午夜精品久久久内射近拍高清| 亚洲视频在线不卡| 能在线观看的av| 手机在线视频你懂的| 国产视频一区二区三区在线播放 | 婷婷中文字幕在线观看| 妺妺窝人体色www看人体| 免费大片在线观看| 欧美日韩dvd| 国产一二三区av| 男人亚洲天堂网| 欧美高清中文字幕| 毛毛毛毛毛毛毛片123| 国产精品亚洲二区在线观看| 免费cad大片在线观看| www.久久av.com| 狠狠热免费视频| 能在线观看的av| 国产一区二区网| 成人免费视频91| 国产专区在线视频| 公共露出暴露狂另类av| 欧美日韩中文不卡| 一区二区三区韩国| 熟女少妇精品一区二区| 欧美性大战久久久久xxx| 国产玉足脚交久久欧美| 少妇一晚三次一区二区三区| 91麻豆天美传媒在线| 五月天婷婷在线观看视频| 91高清国产视频| 免费成年人高清视频| 潘金莲激情呻吟欲求不满视频| 99热成人精品热久久66| 99久久久无码国产精品6| 国产男女在线观看| 亚洲中文字幕无码不卡电影| 日本成人中文字幕在线| 免费男同深夜夜行网站 | 99爱视频在线| 丝袜老师办公室里做好紧好爽| 久久99中文字幕| 不卡影院一区二区| 天天视频天天爽| 日本三日本三级少妇三级66| www.18av.com| 午夜精品久久久内射近拍高清| 日韩一级免费在线观看| 涩涩网站在线看| 久久这里只有精品8| 日韩avxxx| 8x8x成人免费视频| 免费人成在线观看视频播放| 国产a级片网站| 国产无套内射久久久国产| 色免费在线视频| 黄黄视频在线观看| 国产精品50p| 亚洲网中文字幕| 九九爱精品视频| 国产美女18xxxx免费视频| 午夜影院免费版| 丝袜老师办公室里做好紧好爽| www.com黄色片| 成年在线观看视频| 少妇一级淫免费播放| 日韩小视频网站| 毛片毛片毛片毛| 国产精品亚洲αv天堂无码| 色偷偷中文字幕| 看欧美ab黄色大片视频免费| 亚洲一区 在线播放| 丁香婷婷激情网| 国产中文字幕二区| 91在线第一页| 黄色成人免费看| 成人性生活视频免费看| 青青草原国产免费| 在线观看高清免费视频| 成人性免费视频| 色香蕉在线观看| 久久精品国产露脸对白| 超碰在线97免费| 97在线播放视频| 国产真人做爰毛片视频直播| 青少年xxxxx性开放hg| 亚洲天堂2018av| 日本a√在线观看| 99福利在线观看| 日韩黄色片视频| 性一交一乱一伧国产女士spa| 亚洲国产欧美91| 91免费网站视频| 男人j进女人j| 第九区2中文字幕| japanese在线播放| 久久男人资源站| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 日韩亚洲欧美视频| 乱熟女高潮一区二区在线| 少妇高潮流白浆| 最新av网址在线观看| 超薄肉色丝袜足j调教99| 欧洲美女和动交zoz0z| 国产成人免费高清视频| 免费网站永久免费观看| 国产黄页在线观看| 宅男噜噜噜66国产免费观看| 天堂社区在线视频| 91香蕉国产线在线观看| 一级黄色录像免费看| 妞干网视频在线观看| 97在线播放视频| 高潮一区二区三区| 欧美日韩午夜爽爽| 免费 成 人 黄 色| 最新中文字幕免费视频| 日韩视频在线免费播放| 黄色一级在线视频| 黄色国产小视频| 午夜在线视频免费观看| 国产毛片视频网站| 一区二区在线免费看| 国产91porn| 色一情一乱一伦一区二区三区日本 | 爱情岛论坛亚洲首页入口章节| 小明看看成人免费视频| 在线观看17c| 爱情岛论坛成人| 美国av在线播放| 黄色片久久久久| 400部精品国偷自产在线观看 | 亚洲高清在线免费观看| 久久久一二三四| 99免费视频观看| 久久精品xxx| 欧美又黄又嫩大片a级| 精品久久一二三| 特黄特黄一级片| 性生活免费在线观看| 青草网在线观看| 手机av在线网站| youjizzxxxx18| 人妻有码中文字幕| 久草视频国产在线| 路边理发店露脸熟妇泻火| 在线免费观看视频黄| 亚洲熟妇av日韩熟妇在线| 91网址在线观看精品| 免费看污污网站| 日韩毛片在线免费看| 日韩欧美猛交xxxxx无码| 国产毛片久久久久久| 中文字幕丰满乱码| 日本888xxxx| the porn av| av在线无限看| 亚洲污视频在线观看| 精品久久久久久中文字幕2017| 一二三四视频社区在线| 水蜜桃色314在线观看|