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一区二区
日本精品免费在线观看| 99九九99九九九99九他书对| 欧美爱爱视频网站| www.色就是色| the porn av| 亚洲精品一二三四五区| 国产裸体舞一区二区三区| 水蜜桃色314在线观看| 人妻无码一区二区三区四区| 国产香蕉一区二区三区| 裸体大乳女做爰69| 日韩精品一区二区三区电影| 特色特色大片在线| av动漫在线播放| 亚洲一区二区三区av无码| 成人黄色大片网站| 黄色一级在线视频| 男人舔女人下面高潮视频| www.欧美日本| 992kp免费看片| 久久av高潮av| 日韩精品一区中文字幕| 成年人三级黄色片| 免费网站永久免费观看| 久久精品免费一区二区| 欧美女同在线观看| 300部国产真实乱| 黄色免费观看视频网站| 亚洲午夜精品一区| 日本大片免费看| 日本成人在线免费视频| 一级 黄 色 片一| 日本精品免费在线观看| 一级黄色高清视频| 国产二区视频在线| 性生活免费在线观看| 日本精品福利视频| 免费看a级黄色片| 国产美女视频免费| 欧美日韩亚洲第一| 国产成人一二三区| 亚洲第一中文av| 99在线免费视频观看| 中文字幕亚洲欧洲| 69堂免费视频| 少妇高潮大叫好爽喷水| 成人性生生活性生交12| a级黄色片免费| 999在线精品视频| 久久精品视频16| 手机成人av在线| 青青在线视频观看| 久久精品无码中文字幕| 中文字幕日韩综合| 免费男同深夜夜行网站| 国产精品裸体瑜伽视频| 最新av网址在线观看| 国产视频1区2区3区| 久久久久久三级| 欧美日韩第二页| 免费av观看网址| 日本xxxxxxxxxx75| 亚洲理论电影在线观看| 中文字幕免费高| 天天综合成人网| 中文字幕 日韩 欧美| www.xxx亚洲| 美女黄色片视频| 亚洲 激情 在线| 精品久久久久久久无码| 99视频在线视频| 久久黄色片网站| 天堂一区在线观看| 亚洲网中文字幕| 中国一级黄色录像| 日本男女交配视频| 妺妺窝人体色777777| 97成人在线免费视频| 国产免费黄视频| 成年人黄色片视频| 成人综合久久网| 亚洲黄色网址在线观看| 成年人看的毛片| 男女午夜激情视频| 99re精彩视频| 欧美亚洲色图视频| 亚洲国产精品毛片av不卡在线| 久久久久久久免费视频| 人妻有码中文字幕| 国产精品无码人妻一区二区在线| 久久婷五月综合| 99精品人妻少妇一区二区| 无码 制服 丝袜 国产 另类| 男人天堂av片| 自慰无码一区二区三区| 国产 porn| 色撸撸在线观看| 天堂а√在线中文在线| 人妻精品无码一区二区三区| 中文字幕22页| 久操网在线观看| 五月婷婷激情久久| 成人短视频在线看| 毛葺葺老太做受视频| av电影一区二区三区| 国产二级片在线观看| 午夜不卡福利视频| 午夜精品久久久久久久无码 | 911福利视频| 日韩精品福利片午夜免费观看| 凹凸国产熟女精品视频| 国产免费中文字幕| 免费黄色特级片| www.国产在线视频| 久久艹这里只有精品| 中文字幕无码不卡免费视频| 欧美国产视频一区| 日韩欧美国产片| 免费看a级黄色片| 日本午夜激情视频| 蜜桃网站在线观看| 日韩欧美中文视频| 久热精品在线播放| 日韩毛片在线免费看| 黄色一级视频在线播放| 日本福利视频在线观看| 国产资源中文字幕| mm131国产精品| www.欧美日本| 日韩毛片在线免费看| 欧美日韩在线中文| 成人免费播放器| 日本xxxxxxxxxx75| 欧美日韩激情四射| 青草全福视在线| 波多野结衣与黑人| 国产aaa免费视频| 91视频成人免费| 欧美日韩视频免费| www.xxx麻豆| 日韩欧美亚洲天堂| 毛片一区二区三区四区| 亚洲人成无码www久久久| 久久国产乱子伦免费精品| 亚洲精品乱码久久久久久自慰| 欧美aⅴ在线观看| 在线免费观看视频黄| 欧美三级午夜理伦三级富婆| 亚洲第一色av| 国产片侵犯亲女视频播放| cao在线观看| av无码精品一区二区三区| 激情视频免费网站| 91丝袜超薄交口足| 国产www免费| 国产精品入口免费软件| 亚洲免费在线播放视频| 乱熟女高潮一区二区在线| 黄色一级视频片| 日本国产一级片| 国产精品视频二| 搡女人真爽免费午夜网站| 天堂av免费看| 免费av网址在线| 久久视频免费在线| 国产日韩成人内射视频| 一区中文字幕在线观看| 国产在线青青草| 老汉色影院首页| www.xxx亚洲| 国产美女永久无遮挡| www.日本一区| 毛片在线播放视频| 一本—道久久a久久精品蜜桃| 日韩av中文字幕第一页| 久久精品一卡二卡| 日韩一级在线免费观看| 精品久久久无码人妻字幂| 黄色片视频在线| av动漫免费看| 国产一区二区三区乱码| 色噜噜狠狠一区二区三区狼国成人| 无码人妻少妇伦在线电影| 国产精品av免费| 欧美成人三级在线播放| 欧美私人情侣网站| 久操网在线观看| 性高湖久久久久久久久aaaaa| 亚洲美女爱爱视频| 亚洲福利精品视频| 欧美 激情 在线| 久草资源站在线观看| 日韩亚洲欧美视频| 国产精品自拍合集| 99re99热| 三级网在线观看| 婷婷激情小说网| 欧美日韩亚洲国产成人| 亚洲天堂av一区二区三区| 日本一二三四区视频|