亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue內容分發slot(全面解析)

2019-11-19 15:44:22
字體:
來源:轉載
供稿:網友

前面的話

為了讓組件可以組合,需要一種方式來混合父組件的內容與子組件自己的模板。這個過程被稱為 內容分發 (或 “transclusion” )。Vue實現了一個內容分發 API,參照了當前 Web 組件規范草案,使用特殊的 <slot> 元素作為原始內容的插槽。本文將詳細介紹Vue內容分發slot

編譯作用域

在深入內容分發 API 之前,先明確內容在哪個作用域里編譯。假定模板為

<child-component> {{ message }}</child-component>

message 應該綁定到父組件的數據,還是綁定到子組件的數據?答案是父組件。組件作用域簡單地說是:父組件模板的內容在父組件作用域內編譯;子組件模板的內容在子組件作用域內編譯。

一個常見錯誤是試圖在父組件模板內將一個指令綁定到子組件的屬性/方法:

<!-- 無效 --><child-component v-show="someChildProperty"></child-component>

假定someChildProperty是子組件的屬性,上例不會如預期工作。父組件模板不應該知道子組件的狀態

如果要綁定作用域內的指令到一個組件的根節點,應當在組件自己的模板上做:

Vue.component('child-component', { // 有效,因為是在正確的作用域內 template: '<div v-show="someChildProperty">Child</div>', data: function () { return {  someChildProperty: true } }})

類似地,分發內容是在父作用域內編譯

默認丟棄

一般地,如果子組件模板不包含<slot>插口,父組件的內容將會被丟棄

var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <p>測試內容</p> </child> </div> `, components: { 'child': childNode },};
<div id="example"> <parent></parent></div><script src="https://unpkg.com/vue"></script><script>var childNode = { template: ` <div class="child"> <p>子組件</p> </div> `,};var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <p>測試內容</p> </child> </div> `, components: { 'child': childNode },};// 創建根實例new Vue({ el: '#example', components: { 'parent': parentNode }})</script>

如下圖所示,<child>所包含的<p>測試內容</p>被丟棄

匿名slot

當子組件模板只有一個沒有屬性的 slot 時,父組件整個內容片段將插入到 slot 所在的 DOM 位置,并替換掉 slot 標簽本身

var childNode = { template: ` <div class="child"> <p>子組件</p> <slot></slot> </div> `,};
var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <p>測試內容</p> </child> </div> `, components: { 'child': childNode },};

如果出現多于1個的匿名slot,vue將報錯

var childNode = { template: ` <div class="child"> <p>子組件</p> <slot></slot> <slot></slot> </div> `,};

【默認值】

最初在 <slot> 標簽中的任何內容都被視為備用內容,或者稱為默認值。備用內容在子組件的作用域內編譯,并且只有在宿主元素為空,且沒有要插入的內容時才顯示備用內容

當slot存在默認值,且父元素在<child>中沒有要插入的內容時,顯示默認值

var childNode = { template: ` <div class="child"> <p>子組件</p> <slot><p>我是默認值</p></slot> </div> `,};var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child></child> </div> `, components: { 'child': childNode },};

當slot存在默認值,且父元素在<child>中存在要插入的內容時,則顯示設置值

var childNode = { template: ` <div class="child"> <p>子組件</p> <slot><p>我是默認值</p></slot> </div> `,};var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <p>我是設置值</p> </child> </div> `, components: { 'child': childNode },};

具名Slot

<slot> 元素可以用一個特殊的屬性 name 來配置如何分發內容。多個 slot 可以有不同的名字。具名 slot 將匹配內容片段中有對應 slot 特性的元素

var childNode = { template: ` <div class="child"> <p>子組件</p> <slot name="my-header">頭部默認值</slot> <slot name="my-body">主體默認值</slot> <slot name="my-footer">尾部默認值</slot> </div> `,};
var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <p slot="my-header">我是頭部</p>  <p slot="my-footer">我是尾部</p> </child> </div> `, components: { 'child': childNode },};

仍然可以有一個匿名 slot,它是默認 slot,作為找不到匹配的內容片段的備用插槽。匿名slot只能作為沒有slot屬性的元素的插槽,有slot屬性的元素如果沒有配置slot,則會被拋棄

var childNode = { template: ` <div class="child"> <p>子組件</p> <slot name="my-body">主體默認值</slot> <slot></slot> </div> `,};
var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <p slot="my-body">我是主體</p>  <p>我是其他內容</p>  <p slot="my-footer">我是尾部</p> </child> </div> `, components: { 'child': childNode },};

<p slot="my-body">插入<slot name="my-body">中,<p>我是其他內容</p>插入<slot>中,而<p slot="my-footer">被丟棄

如果沒有默認的 slot,這些找不到匹配的內容片段也將被拋棄

var childNode = { template: ` <div class="child"> <p>子組件</p> <slot name="my-body">主體默認值</slot> </div> `,};
var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <p slot="my-body">我是主體</p>  <p>我是其他內容</p>  <p slot="my-footer">我是尾部</p> </child> </div> `, components: { 'child': childNode },};

<p>我是其他內容</p>和<p slot="my-footer">都被拋棄

作用域插槽

作用域插槽是一種特殊類型的插槽,用作使用一個 (能夠傳遞數據到) 可重用模板替換已渲染元素。

在子組件中,只需將數據傳遞到插槽,就像將 props 傳遞給組件一樣

<div class="child"> <slot text="hello from child"></slot></div>

在父級中,具有特殊屬性 scope 的 <template> 元素必須存在,表示它是作用域插槽的模板。scope 的值對應一個臨時變量名,此變量接收從子組件中傳遞的 props 對象

var childNode = { template: ` <div class="child"> <p>子組件</p>  <slot xxx="hello from child"></slot> </div> `,};var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <template scope="props">  <p>hello from parent</p>  <p>{{ props.xxx }}</p>  </template> </child> </div> `, components: { 'child': childNode },};

如果渲染以上結果,得到的輸出是

【列表組件】

作用域插槽更具代表性的用例是列表組件,允許組件自定義應該如何渲染列表每一項

var childNode = { template: ` <ul> <slot name="item" v-for="item in items" :text="item.text">默認值</slot> </ul> `, data(){ return{  items:[  {id:1,text:'第1段'},  {id:2,text:'第2段'},  {id:3,text:'第3段'},  ] } }};
var parentNode = { template: ` <div class="parent"> <p>父組件</p> <child>  <template slot="item" scope="props">  <li>{{ props.text }}</li>  </template> </child> </div> `, components: { 'child': childNode },};

以上這篇Vue內容分發slot(全面解析)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美巨乳在线观看| 国产精品入口免费视频一| 久久综合亚洲社区| 日韩电影视频免费| 久久久亚洲精品视频| 另类美女黄大片| 国产日韩欧美视频| 欧美精品日韩三级| 国产精品亚洲激情| 欧美日韩国产123| 久久久久久国产三级电影| 91sa在线看| 欧美一级电影免费在线观看| 国产精品精品视频一区二区三区| 国产成人福利夜色影视| 97视频免费在线观看| 成人国内精品久久久久一区| 亚洲国产日韩一区| 精品国内自产拍在线观看| 亚洲精品国产成人| 成人黄色av网站| 国产日本欧美一区二区三区| 亚洲精品中文字| 欧美成人精品在线观看| 国产精品一区二区3区| 黑人巨大精品欧美一区二区三区| 深夜福利日韩在线看| 亚洲福利视频专区| 欧美国产视频日韩| 欧美在线视频一区二区| 精品国产91久久久久久| 精品国产一区av| 久久久精品视频在线观看| 欧美日本亚洲视频| 国产精品老女人视频| 九九视频这里只有精品| 久久久999国产精品| 亚洲国产精品女人久久久| 亚洲人成伊人成综合网久久久| 亚洲精品久久7777777| 性色av一区二区三区免费| 欧美激情一区二区久久久| www.国产一区| 国产精品青草久久久久福利99| 日本久久中文字幕| 国内揄拍国内精品少妇国语| 亚洲一区二区三区四区视频| 668精品在线视频| 91久久精品日日躁夜夜躁国产| 日韩午夜在线视频| 日韩女优在线播放| 91久久嫩草影院一区二区| 精品无人国产偷自产在线| 亚洲精品二三区| 亚洲va国产va天堂va久久| 亚洲高清不卡av| 亚洲国产婷婷香蕉久久久久久| 欧美性猛交丰臀xxxxx网站| 国产成人91久久精品| xvideos亚洲人网站| 欧美超级乱淫片喷水| 亚洲天堂第一页| 国产免费一区二区三区香蕉精| 91视频九色网站| 国产精品吹潮在线观看| 欧美激情视频网站| 亚洲欧洲国产精品| 中文字幕日韩专区| 欧美性极品少妇精品网站| 国产精品自拍小视频| 国产免费一区二区三区香蕉精| 6080yy精品一区二区三区| 精品网站999www| 欧美一级黄色网| 精品成人国产在线观看男人呻吟| 国产一区二区欧美日韩| 日韩在线视频网| 成人精品在线观看| 国产精品男女猛烈高潮激情| 2018日韩中文字幕| 亚洲激情在线观看| 亚洲精品视频免费在线观看| 精品一区二区亚洲| 日韩精品久久久久久久玫瑰园| 日韩天堂在线视频| 日韩成人av在线| 97久久精品人搡人人玩| 国内精品视频一区| 国产精品私拍pans大尺度在线| 精品美女久久久久久免费| 欧美另类极品videosbest最新版本| 国产精品爱久久久久久久| 日韩精品在线观看视频| 亚洲欧美国产精品久久久久久久| 国产高清视频一区三区| 美女啪啪无遮挡免费久久网站| 欧美制服第一页| 国产一区二区三区在线看| 日韩av成人在线观看| 欧美伊久线香蕉线新在线| 欧美高跟鞋交xxxxxhd| 欧美激情一区二区三区久久久| 国产一区二区美女视频| 欧美洲成人男女午夜视频| 97在线观看免费| 国产精品人人做人人爽| 欧美激情第一页xxx| 欧美精品第一页在线播放| 亚洲国产婷婷香蕉久久久久久| 91伊人影院在线播放| 欧美激情在线一区| 精品国产鲁一鲁一区二区张丽| 91精品国产高清久久久久久久久| 57pao成人国产永久免费| 国产精品亚洲美女av网站| 久久久久久久久久久av| 日本sm极度另类视频| 亚洲福利视频专区| 久久久久久久一区二区三区| 国产激情综合五月久久| 日本不卡高字幕在线2019| 亚洲xxxxx电影| 欧美国产日产韩国视频| 欧美美最猛性xxxxxx| 日本精品在线视频| 亚洲激情久久久| 成人国内精品久久久久一区| 国产精品美女www| 日韩精品久久久久久久玫瑰园| 俺去亚洲欧洲欧美日韩| 超碰精品一区二区三区乱码| 亚洲аv电影天堂网| 亚洲丝袜在线视频| 亚洲美女久久久| 91日本在线观看| 精品自拍视频在线观看| 亚洲视频在线免费看| 欧美日韩中国免费专区在线看| 国产精品久久久久久久美男| 日韩福利伦理影院免费| 91精品国产91久久久久| 国产成人精品一区二区在线| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩国产精品| 精品国产一区久久久| 精品中文字幕乱| 国产精品视频久久| 亚洲欧美色婷婷| 久久九九国产精品怡红院| 中国日韩欧美久久久久久久久| 日韩免费在线视频| 国产成+人+综合+亚洲欧美丁香花| 91中文精品字幕在线视频| 国产精品a久久久久久| 亚洲毛片在线看| 亚洲精品av在线| 国产亚洲综合久久| 懂色av一区二区三区| 国产欧美久久一区二区| 久久久久久久久爱| 最近2019年中文视频免费在线观看| 97精品久久久| 久久国产一区二区三区| 欧美华人在线视频|