Vuejs:組件 slot 內容分發

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

本文是在官方文檔的基礎上,更加細致的說明,代碼更多更全。

簡單來說,更適合新手閱讀

(二十八)Slot分發內容

①概述:

簡單來說,假如父組件需要在子組件內放一些DOM,那么這些DOM是顯示、不顯示、在哪個地方顯示、如何顯示,就是slot分發負責的活。

②默認情況下

父組件在子組件內套的內容,是不顯示的。

例如代碼:

<div?id="app">??<children>??<span>12345</span>??<!--上面這行不會顯示-->??</children>??
</div>??
<script>??var?vm?=?new?Vue({??el:?'#app',??components:?{??children:?{????//這個無返回值,不會繼續派發??template:?"<button>為了明確作用范圍,所以使用button標簽</button>"??}??}??});??
</script>??

顯示內容是一個button按鈕,不包含span標簽里面的內容;

③單個slot

簡單來說,只使用這個標簽的話,可以將父組件放在子組件的內容,放到想讓他顯示的地方。

<div?id="app">??<children>??<span>12345</span>??<!--上面這行不會顯示-->??</children>??
</div>??
<script>??var?vm?=?new?Vue({??el:?'#app',??components:?{??children:?{????//這個無返回值,不會繼續派發??template:?"<button><slot></slot>為了明確作用范圍,所以使用button標簽</button>"??}??}??});??
</script>??

例如這樣寫的話,結果是:

<button><span>12345</span>為了明確作用范圍,所以使用button標簽</button>

即父組件放在子組件里的內容,插到了子組件的<slot></slot>位置;

注意,即使有多個標簽,會一起被插入,相當于用父組件放在子組件里的標簽,替換了<slot></slot>這個標簽。

④具名slot

將放在子組件里的不同html標簽放在不同的位置

父組件在要分發的標簽里添加?slot=”name名”?屬性

子組件在對應分發的位置的slot標簽里,添加name=”name名”?屬性,

然后就會將對應的標簽放在對應的位置了。

示例代碼:

<div?id="app">??<children>??<span?slot="first">12345</span>??<span?slot="second">56789</span>??<!--上面這行不會顯示-->??</children>??
</div>??
<script>??var?vm?=?new?Vue({??el:?'#app',??components:?{??children:?{????//這個無返回值,不會繼續派發??template:?"<button><slot?name='first'></slot>為了明確作用范圍,<slot?name='second'></slot>所以使用button標簽</button>"??}??}??});??
</script>??

顯示結果為:(為了方便查看,已手動調整換行)

<button>

<span slot="first">12345</span>

為了明確作用范圍,

<span slot="second">56789</span>

所以使用button標簽

</button>

⑤分發內容的作用域:

被分發的內容的作用域,根據其所在模板決定,例如,以上標簽,其在父組件的模板中(雖然其被子組件的children標簽所包括,但由于他不在子組件的template屬性中,因此不屬于子組件),則受父組件所控制。

示例代碼:

<div?id="app">??<children>??<span?slot="first"?@click="tobeknow">12345</span>??<span?slot="second">56789</span>??<!--上面這行不會顯示-->??</children>??
</div>??
<script>??var?vm?=?new?Vue({??el:?'#app',??methods:?{??tobeknow:?function?()?{??console.log("It?is?the?parent's?method");??}??},??components:?{??children:?{????//這個無返回值,不會繼續派發??template:?"<button><slot?name='first'></slot>為了明確作用范圍,<slot?name='second'></slot>所以使用button標簽</button>"??}??}??});??
</script>??

當點擊文字12345的區域時(而不是按鈕全部),會觸發父組件的tobeknow方法。

但是點擊其他區域時則沒有影響。

官方教程是這么說的:

父組件模板的內容在父組件作用域內編譯;子組件模板的內容在子組件作用域內編譯。

⑥當沒有分發內容時的提示:

假如父組件沒有在子組件中放置有標簽,或者是父組件在子組件中放置標簽,但有slot屬性,而子組件中沒有該slot屬性的標簽。

那么,子組件的slot標簽,將不會起到任何作用。

除非,該slot標簽內有內容,那么在無分發內容的時候,會顯示該slot標簽內的內容。

如示例代碼:

<div?id="app">??<children>??<span?slot="first">【12345】</span>??<!--上面這行不會顯示-->??</children>??
</div>??
<script>??var?vm?=?new?Vue({??el:?'#app',??components:?{??children:?{????//這個無返回值,不會繼續派發??template:?"<div><slot?name='first'><button>【如果沒有內容則顯示我1】</button></slot>為了明確作用范圍,<slot?name='last'><button>【如果沒有內容則顯示我2】</button></slot>所以使用button標簽</div>"??}??}??});??
</script>?

?說明:

【1】name=’first’的slot標簽被父組件對應的標簽所替換(slot標簽內部的內容被舍棄);

【2】name=’last’的slot標簽,因為沒有對應的內容,則顯示該slot標簽內部的內容。

⑦假如想控制子組件根標簽的屬性?

【1】首先,由于模板標簽是屬于父組件的,因此,將子組件的指令綁定在模板標簽里,是不可以的(因為他歸屬于父組件);

【2】假如需要通過父組件控制子組件是否顯示(例如v-if或者v-show),那么這個指令顯然是屬于父組件的(例如放在父組件的data下面)。可以將標簽寫在子組件的模板上。

如代碼:

<div?id="app">??<button?@click="toshow">點擊讓子組件顯示</button>??<children?v-if="abc">??</children>??
</div>??
<script>??var?vm?=?new?Vue({??el:?'#app',??data:?{??abc:?false??},??methods:?{??toshow:?function?()?{??this.abc?=?!this.abc;??}??},??components:?{??children:?{????//這個無返回值,不會繼續派發??template:?"<div>這里是子組件</div>"??}??}??});??
</script>??

說明:通過父組件(點擊按鈕,切換v-if指令的值)控制子組件是否顯示。

【3】假如需要通過子組件,控制子組件是否顯示(比如讓他隱藏),那么這個指令顯然是屬于子組件的(會將值放在子組件的data屬性下),那么就不能像上面這么寫,而是必須放置在子組件的根標簽中。

<div?id="app">??<button?@click="toshow">點擊讓子組件顯示</button>??<children>??<span?slot="first">【12345】</span>??<!--上面這行不會顯示-->??</children>??
</div>??
<script>??var?vm?=?new?Vue({??el:?'#app',??methods:?{??toshow:?function?()?{??this.$children[0].tohidden?=?true;??}??},??components:?{??children:?{????//這個無返回值,不會繼續派發??template:?"<div?v-if='tohidden'?@click='tohide'>這里是子組件</div>",??data:?function?()?{??return?{??tohidden:?true??}??},??methods:?{??tohide:?function?()?{??this.tohidden?=?!this.tohidden;??}??}??}??}??});??
</script>??

說明:

點擊子組件會讓子組件消失;

點擊父組件的按鈕,通過更改子組件的tohidden屬性,讓子組件重新顯示。

子組件的指令綁定在子組件的模板之中(如此才能調用);

轉自:https://blog.csdn.net/sinat_17775997/article/details/52484072#comments

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++獲取本機所有ip地址,可區分類型是有線無線虛擬機還是回環

一個小程序&#xff0c;可以獲取本地所有ip地址&#xff0c;包括有線&#xff0c;無線&#xff0c;虛擬機&#xff0c;環回接口網卡&#xff0c;等。 如圖&#xff0c;一臺機器多個網卡&#xff1a; 程序執行結果&#xff1a; #include"stdio.h" #include"…

頓悟人生十一句話

一、永遠不要埋怨你已經發生的事情 如果你打算忍受一件事情就閉上嘴巴吧。要么就改變它&#xff0c;要么就安靜的接受它。 二、最讓你忿忿不平的問題&#xff0c;就是你需要解決的問題 一個被酒后駕駛的司機撞死自己兒子的婦女&#xff0c;發起了反對酒后駕駛母親協會…

Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用mybatis可以逆向生成pojo和mapper文件有很多種方式&#xff0c;我以前用的是mybtais自帶的generator包來生成&#xff0c;連接如下&…

控制臺程序隱藏方法總結(四種)

學習計算機&#xff0c;往往先從Windows環境下學習編程&#xff0c;學習編程&#xff0c;往往從C學起&#xff0c;學習C&#xff0c;往往又從控制臺程序學習&#xff0c;何為控制臺&#xff0c;就是那個黑框白字的界面。對于這樣一個最初認為奇陋無比而現在認為無所不能的編程平…

十大教養,讓你氣度非凡!

01.守時 無論是開會、赴約&#xff0c;有教養的人從不遲到。他們懂得&#xff0c;即使是無意遲到&#xff0c;對其他準時到場的人來說&#xff0c;也是不尊重的表現。 02.談吐有節 注意從不隨便打斷別人的談話&#xff0c;總是先聽完對方的發言&#xff0c;然后再去反駁或者補…

mybatis :Criteria 查詢、條件過濾用法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;hibernate 中也有 Criteria 的用法&#xff0c;見另一文章&#xff1a;jpa : criteria 作排除過濾、查詢 1. 包&#xf…

C++11多線程----線程管理

說到多線程編程&#xff0c;那么就不得不提并行和并發&#xff0c;多線程是實現并發&#xff08;并行&#xff09;的一種手段。并行是指兩個或多個獨立的操作同時進行。注意這里是同時進行&#xff0c;區別于并發&#xff0c;在一個時間段內執行多個操作。在單核時代&#xff0…

揭秘賺錢的技巧,學會讓錢自己進來

學習把負債變為資產 貧窮是一種習慣&#xff0c;而不只是口袋里金錢的多寡。 每個人每天的時間是相同的&#xff0c;有人利用它來打工&#xff0c;賺取約80新臺幣的工資。也有人將時間用來教書&#xff0c;每小時賺取約500新臺幣&#xff0c;也有人用這些時間來上網&#xff0c…

Shell編程入門基礎上

前言 為什么學 Shell Shell 腳本語言是實現 Linux/UNIX 系統管理及自動化運維所必備的重要工具&#xff0c; Linux/UNIX 系統的底層及基礎應用軟件的核心大都涉及 Shell 腳本的內容。每一個合格 的Linux 系統管理員或運維工程師&#xff0c;都需要能夠熟練地編寫 Shell 腳本語言…

寶寶不開心 : 減肚子大戰進行中、持續更新,看看一個月后能不能把腰瘦下來 ...

公司研發中心離家很近&#xff0c;于是來這邊后就天天回家吃吃、喝喝、睡睡 ... 中午一個半小時休&#xff0c;吃完就滾上床鋪&#xff1a;睡午覺&#xff0c;就這樣 天天過得好不愜意 ... // 每周也會發零售&#xff0c;大家都吃得樂呵呵的&#xff0c;晚上加班都是組上好些個…

內存問題提醒!結構體+protobuf做協議體發送!序列化

內存的三種分配方式&#xff1a; 1&#xff0e; 從靜態存儲區分配&#xff1a;此時的內存在程序編譯的時候已經分配好&#xff0c;并且在程序的整個運行期間都存在。全局變量&#xff0c;static變量等在此存儲。 2&#xff0e; 在棧區分配&#xff1a;相關代碼執行時創建&…

窮人邁向富翁的理財十步曲

當你每日的儲蓄隨著時間的累積&#xff0c;達到一定數量后再轉存到存款薄里&#xff0c;如此日積月累&#xff0c;就可以逐漸養成自身存錢理財的習慣。不管你做什么事情&#xff0c;是否養成了良好的習慣&#xff0c;都會決定你的成敗。理財投資也是同樣道理&#xff0c;在你養…

【融云分析】選擇IM云服務,需要看哪些核心技術指標?

IM&#xff08;即時通訊&#xff09;云服務已發展數年&#xff0c;不少企業與開發者都傾向于選擇第三方IM云服務&#xff0c;短平快地為應用添加即時通訊能力&#xff0c;但如何選擇服務商卻是個難題&#xff0c;單從簡單的功能介紹來看無法判斷&#xff0c;因為IM云服務接入后…

Nginx 配置詳解

序言 Nginx是lgor Sysoev為俄羅斯訪問量第二的rambler.ru站點設計開發的。從2004年發布至今&#xff0c;憑借開源的力量&#xff0c;已經接近成熟與完善。 Nginx功能豐富&#xff0c;可作為HTTP服務器&#xff0c;也可作為反向代理服務器&#xff0c;郵件服務器。支持FastCGI…

protocol buffers使用說明

一、什么是protocol buffers Protocol buffers是一個靈活的、高效的、自動化的用于對結構化數據進行序列化的協議&#xff0c;與XML相比&#xff0c;Protocol buffers序列化后的碼流更小、速度更快、操作更簡單。你只需要將要被序列化的數據結構定義一次(譯注&#xff1a;使用…

jeeCMS首頁加載流程

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/gyshun/article/details/79669293 如果JEECMS部署完畢之后&#xff0c;在瀏覽器中輸入http://localhost:8080/jeecms&#xff0c;系統直接會按照以下步驟執行&#xff1a; 首…

車子突然溜坡追尾 駕校教練說掛P擋拉手剎不會溜坡

昨天4:44&#xff0c;朱先生來電&#xff1a;剛才登云路一個燒烤店門口&#xff0c;一輛車停在自己的車位上的&#xff0c;不知什么原因&#xff0c;突然溜坡撞上前面的一輛出租車。稀奇的是&#xff0c;這個溜坡的駕駛員全程都是車上睡覺睡著的&#xff0c;什么都不知道。記者…

VSCode 漢化、設置為 中文語言顯示 、中文界面

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Vscode是一款開源的跨平臺編輯器。默認情況下&#xff0c;vscode使用的語言為英文(us)&#xff0c;如何將其顯示語言修改成中文了&#…

c++執行vbs腳本

#include<fstream> using namespace std;int main() {fstream out("StartIE.vbs",ios::out);out<<"AppName\"啟動IE\"\n\Set WshellWScript.CreateObject(\"WScript.Shell\")\n\Set ieWScript.CreateObject(\"InternetEx…

Python-21-socket編程

一、基礎知識 1. C/S架構 C/S架構即客戶機/服務器模式。 它可以分為客戶機和服務器兩層&#xff1a; 第一層: 在客戶機系統上結合了界面顯示與業務邏輯&#xff1b; 第二層: 通過網絡結合了數據庫服務器。 簡單的說就是第一層是用戶表示層&#xff0c;第二層是數據庫層。 這里…