vue組件插槽

組件的插槽

組件本身就是一個容器,也可以是一個vue對象,也是一個虛擬DOM

普通插槽

組件本身是一個容器,這個容器本身是空的,當我們把需要封裝的html結構裝進去之后,我們可以認為這個容器被塞滿了,那就意味著,我們無法想組件內部添加新的html結構進去,但是我們想在每次調用組件的時候需要渲染一些個性化的東西,這個時候我們就需要給組件做一個預留空間,這個預留空間就是插槽

<body><div id="app"><one><p>我是子標題</p></one></div><template id="temp1"><div><h2>我是標題</h2></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1"}new Vue({el:"#app",components:{one}})
</script>

代碼分析:

以上的代碼渲染之后,我們在虛擬DOM中寫入了一個p標簽,著就是所謂的插入,但是并沒有效果,因為我們并沒有在one組件中預留空間,也就是插槽

如果想在組件內部預留插槽,使用 <slot></slot>

<body><div id="app"><one><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p></one></div><template id="temp1"><div><h2>我是標題</h2><slot><!-- 組件內預留給插槽的空間 --></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1"}new Vue({el:"#app",components:{one}})
</script>
一個插入點插入多個插槽

現在我們想讓剛才的代碼中前3個p標簽出現在標題的上方,后面3個出現在標題的下方

<body><div id="app"><one><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p><p>我是子標題</p></one></div><template id="temp1"><div><slot></slot><h2>我是標題</h2><slot></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1"}new Vue({el:"#app",components:{one}})
</script>

代碼分析:

上面的代碼中,我們發現,在模板中的標題上方也制作了一個插槽slot,但是,從效果上來看只是單純把插入的內容復制了一份,分別插入不同的插槽里面

其實我們上面寫的都是默認插槽,把插槽語法寫完成如下

<div id="app"><one><p slot="default">我是子標題</p><p slot="default">我是子標題</p><p slot="default">我是子標題</p><p slot="default">我是子標題</p><p slot="default">我是子標題</p><p slot="default">我是子標題</p></one>
</div>
<template id="temp1"><div><slot name="default"></slot><h2>我是標題</h2><slot name="default"></slot></div>
</template>

默認情況下,所有的slot都必須要指定一個name,只是如果我們不自己指定的話,系統會給我們指定一個默認的名稱default

具名插槽

在上面的插槽中,我們所有的slot如果在不指定name的情況下全都是default,但是這個name屬性可以設置的,如果設置一些其他的值,我們就把這個插槽叫做具名插槽

<div id="app"><one><p slot="top">我是子標題</p><p slot="top">我是子標題</p><p slot="top">我是子標題</p><p slot="bottom">我是子標題</p><p slot="bottom">我是子標題</p><p slot="bottom">我是子標題</p></one>
</div>
<template id="temp1"><div><slot name="top"></slot><h2>我是標題</h2><slot name="bottom"></slot></div>
</template>

代碼分析:

在上面的代碼中,我們可以為插槽取一個名字,從而實現一對多,或者多對一的插入,當插槽有了名字之后,我們就可以在插入的時候指定插入到某一個插槽中

  • 我們組件里面定義插槽的時候使用slot標簽,并且這個標簽上面定義name屬性,成為具名插槽
  • 在調用組件的時候,我們可以向指定的插槽插入內容,只需要在這個插入的元素上面添加一個slot=“插槽名”即可
  • 具名插槽是可以多次使用的,所以我們可以把上面的top復制一份放到bottom的下面,這樣上面三個p標簽也會出現在下面的插槽里面

插槽作用域

<body><div id="app"><one><p>我想要拿到組件內部的userName</p></one></div><template id="temp1"><div><h2>我是一個組件</h2><slot><!-- 組件的預留空間 --></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1",data(){return {userName:"zhangsan"}}}new Vue({el:"#app",components:{one}})
</script>

之前我們一直都是外部的數據傳遞給內部,如果要把組件內部的數據傳遞給外部,我們可以:

1、利用對象的堆棧原理

2、自定義事件

注意:

我們現在要做一個區分,我們是可以把數據渲染在組件里面的,也可以渲染在插槽里面,但是這兩種方式在向組件外部傳值的時候是有區別的,我們上面說的這兩種方法,只針對在組件內渲染的,如果是渲染在組件的插槽內部的,我們可以通過插槽作用域取拿

比如我們現在要userName的值傳遞到外面,我們可以在插入的標簽上面添加一個slot-scope=“scope”

<body><div id="app"><one><div slot-scope="scope"><p>{{scope.userName}}</p><p>{{scope.age}}</p></div>            </one></div><template id="temp1"><div><h2>我是一個組件</h2><slot :user-name="userName" :age="18"><!-- 組件的預留空間 --></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1",data(){return {userName:"zhangsan"}}}new Vue({el:"#app",components:{one}})
</script>

插槽作用域舊版本語法

<div id="app"><one><div slot="footer" slot-scope="scope"><p>{{scope.userName}}</p><p>{{scope.age}}</p></div>            </one></div><template id="temp1"><div><h2>我是一個組件</h2><slot name="footer" :user-name="userName" :age="18"><!-- 組件的預留空間 --></slot></div></template>

新版本語法

<one><template v-slot:footer="scope"><p>{{scope.userName}}</p><p>{{scope.age}}</p></template>            
</one>

最新語法

<one><template #footer="{userName,age}"><p>{{userName}}</p>"<p>{{age}}</p></template>            
</one>

代碼分析:

最新語法可以直接解構獲取,并且v-slot這個指令也直接使用#來替代,簡化代碼

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

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

相關文章

WIN11家庭中文版使用ENSP+VirtualBox啟動AR失敗40錯誤+未完全關閉hyper-V,以及安裝VirtualBox兼容性問題

使用版本&#xff1a;eNSP 1.3.00.100VirtualBox 5.2.44WinPcap_4_1_3Wireshark最新版。 win11系統最好按照上述版本安裝&#xff0c;VirtualBox不要安裝更高版本&#xff0c;否則可能出現不兼容情況&#xff0c;Wireshark版本要求還好&#xff0c;安裝順序是VirtualBox 5.2.4…

python+pytest接口自動化之參數關聯

什么是參數關聯&#xff1f; 參數關聯&#xff0c;也叫接口關聯&#xff0c;即接口之間存在參數的聯系或依賴。在完成某一功能業務時&#xff0c;有時需要按順序請求多個接口&#xff0c;此時在某些接口之間可能會存在關聯關系。比如&#xff1a;B接口的某個或某些請求參數是通…

如何利用人工智能+物聯網技術實現自動化設備生產

隨著科技的發展與行業競爭的日益激烈&#xff0c;制造業也逐漸走向智能化發展。制造業的改革是利用物聯網技術和自動化設備&#xff0c;實現生產線的智能化和自適應生產&#xff0c;優化生產流程&#xff0c;提高生產效率和質量&#xff0c;為企業創造更大的價值。 方案概述 智…

Gif表情包怎么用圖片制作?一招簡單易上手

很多朋友對于gif動圖的名字不是很熟悉&#xff0c;但是對于“gif表情包”一定很熟悉吧&#xff01;在日常網絡聊天中經常能見到其的身影&#xff0c;能夠調節聊天的氣氛。想要制作gif表情包可以使用gif動圖在線制作&#xff08;https://www.gif.cn/&#xff09;網站-GIF中文網&…

【C語言期末】題目+解析

文章目錄 題目1.下面哪個不是C語言的基本數據類型&#xff1f;&#xff08; B &#xff09;2.C語言的標識符應以字母或&#xff08; A &#xff09;開頭。3.如果需要在C程序里調用標準函數庫中的printf函數&#xff0c;則應該在程序的開頭包含哪個頭文件&#xff1f;&#xff0…

學習Linux(2)-學習Linux命令

Linux目錄結構 Linux目錄結構-菜鳥教程 /bin&#xff1a;bin 是 Binaries (二進制文件) 的縮寫, 這個目錄存放著最經常使用的命令。 /boot&#xff1a;這里存放的是啟動 Linux 時使用的一些核心文件&#xff0c;包括一些連接文件以及鏡像文件。 /dev &#xff1a;dev 是 De…

TensorFlow 常用代碼

TensorFlow 是由 Google 開發的一個用于數值計算的開源軟件庫&#xff0c;主要用于構建和訓練機器學習模型。它的核心是使用數據流圖來描述計算任務。數據流圖是由節點和邊組成的有向圖&#xff0c;每個節點表示一個計算任務&#xff0c;每條邊表示數據傳輸。 TensorFlow 支持…

Dockerfile文件

什么是dockerfile? Dockerfile是一個包含用于組合映像的命令的文本文檔。可以使用在命令行中調用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。 docker build命令用于從Dockerfile構建映像。可以在docker build命令中使用-f標志指向文件系統中任何位置的Docke…

C語言-字符串操作函數-附加使用方式

文章目錄 前言字符串復制-strcpy字符串復制&#xff08;按照位數&#xff09;-strncpy字符串比較-strcmp字符串比較(按照位數)-strncmp不區分大小寫的字符串比較-strcasecmp不區分大小寫的比較(前n位)-strncasecmp字符串按照格式寫入-sprintf字符串按照格式和個數寫入-snprintf…

JUC包(面試常問)

1. Callable接口 類似于Runnable接口&#xff0c;Runnable描述的任務&#xff0c;不帶返回值&#xff1b;Callable描述的任務帶返回值。 public class Test {//創建線程&#xff0c;計算12...1000public static void main(String[] args) throws ExecutionException, Interru…

js/jQuery常見操作 之各種語法例子(包括jQuery中常見的與索引相關的選擇器)

js/jQuery常見操作 之各種語法例子&#xff08;包括jQuery中常見的與索引相關的選擇器&#xff09; 1. 操作table常見的1.1 動態給table添加title&#xff08;指定td&#xff09;1.1.1 給td動態添加title&#xff08;含&#xff1a;獲取tr的第幾個td&#xff09;1.1.2 動態加工…

KWin、libdrm、DRM從上到下全過程 —— drmModeAddFBxxx(23)

接前一篇文章:KWin、libdrm、DRM從上到下全過程 —— drmModeAddFBxxx(22) 上一回講解了i915_gem_object_lookup_rcu函數的第1個參數struct drm_file *file,本回講解其第2個參數u32 handle。 (2)參數u32 handle 說起來,handle要比struct drm_file *file參數好理解多了…

怎么更改android的包名,使其可以變成另外一個app

在 Android 中更改應用的包名并不是一項簡單的任務&#xff0c;因為包名在應用的整個代碼和配置文件中都被廣泛使用。但是&#xff0c;你可以通過以下步驟來更改應用的包名&#xff1a; 注意&#xff1a;在更改包名之前&#xff0c;請確保備份你的項目&#xff0c;以防發生意外…

thinkphp 結合swoole 聊天開發實例

好的&#xff0c;下面我為您介紹使用ThinkPHP和Swoole開發聊天應用的實例。 環境搭建 首先需要安裝PHP和Swoole擴展&#xff0c;可以使用以下命令&#xff1a; yum install php php-devel php-pear pecl install swoole新建項目 使用composer新建一個ThinkPHP項目&#xff…

每日一練【三數之和】

一、題目描述 15. 三數之和 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請 你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可…

【開題報告】基于SSM的校園體育管預約系統的設計與實現

1.選題背景 隨著社會的發展和人們對健康生活的追求&#xff0c;體育鍛煉在大學生群體中越來越受到重視。校園體育場館是大學生進行體育活動和鍛煉的主要場所之一。然而&#xff0c;由于校園體育場館資源有限&#xff0c;管理不善和預約流程繁瑣等問題&#xff0c;導致場館利用…

【數據結構(九)】線索化二叉樹(3)

文章目錄 1. 前言——問題引出2. 線索二叉樹的基本介紹3. 線索二叉樹的應用案例3.1. 思路分析3.2. 代碼實現 4. 遍歷線索化二叉樹4.1. 代碼實現 1. 前言——問題引出 問題&#xff1a; ????將數列 {1, 3, 6, 8, 10, 14 } 構建成一顆二叉樹. &#xff08;n17個空指針域&…

1688API接口系列,商品詳情數據丨搜索商品列表丨商家訂單類丨1688開放平臺接口使用方案

1688商品詳情接口是指1688平臺提供的API接口&#xff0c;用于獲取商品詳情信息。通過該接口&#xff0c;您可以獲取到商品的詳細信息&#xff0c;包括商品標題、價格、庫存、描述、圖片等。 要使用1688商品詳情接口&#xff0c;您需要先申請1688的API權限&#xff0c;并獲取ac…

老有所依:TSINGSEE青犀養老院智能視頻監管方案

養老院智能監控方案是為了提高養老院內老人的安全和護理質量&#xff0c;利用智能技術與監控設備進行全方位的監控和管理&#xff0c;可以加強對老人的監護和護理&#xff0c;提高養老院的服務質量和安全性。 旭帆科技基于視頻技術與AI智能分析技術構建的養老院智能視頻監控方…

[動態規劃]最長公共子序列

題目六 最長公共子序列 題目描述 我們稱一個字符的數組S為一個序列。對于另外一個字符數組Z,如果滿足以下條件&#xff0c;則稱Z是S的一個子序列&#xff1a;&#xff08;1&#xff09;Z中的每個元素都是S中的元素&#xff08;2&#xff09;Z中元素的順序與在S中的順序一致。…