vue插槽的使用(slot)

插槽

該頁面假設你已經閱讀過了組件基礎。如果你還對組件不太了解,推薦你先閱讀它。

插槽內容

Vue 實現了一套內容分發的 API,這套 API 基于當前的?Web Components 規范草案,將?<slot>?元素作為承載分發內容的出口。

它允許你像這樣合成組件:

<navigation-link url="/profile">
Your Profile
</navigation-link>

然后你在?<navigation-link>?的模板中可能會寫為:

<a
v-bind:href="url"
class="nav-link"
>
<slot></slot>
</a>

當組件渲染的時候,這個?<slot>?元素將會被替換為“Your Profile”。插槽內可以包含任何模板代碼,包括 HTML:

<navigation-link url="/profile">
<!-- 添加一個 Font Awesome 圖標 -->
<span class="fa fa-user"></span>
Your Profile
</navigation-link>

甚至其它的組件:

<navigation-link url="/profile">
<!-- 添加一個圖標的組件 -->
<font-awesome-icon name="user"></font-awesome-icon>
Your Profile
</navigation-link>

如果?<navigation-link>?沒有包含一個?<slot>?元素,則任何傳入它的內容都會被拋棄。

具名插槽

有些時候我們需要多個插槽。例如,一個假設的?<base-layout>?組件多模板如下:

<div class="container">
<header>
<!-- 我們希望把頁頭放這里 -->
</header>
<main>
<!-- 我們希望把主要內容放這里 -->
</main>
<footer>
<!-- 我們希望把頁腳放這里 -->
</footer>
</div>

對于這樣的情況,<slot>?元素有一個特殊的特性:name。這個特性可以用來定義額外的插槽:

<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>

在向具名插槽提供內容的時候,我們可以在一個父組件的?<template>?元素上使用?slot特性:

<base-layout>
<template slot="header">
<h1>Here might be a page title</h1>
</template>

<p>A paragraph for the main content.</p>
<p>And another one.</p>

<template slot="footer">
<p>Here's some contact info</p>
</template>
</base-layout>

另一種?slot?特性的用法是直接用在一個普通的元素上:

<base-layout>
<h1 slot="header">Here might be a page title</h1>

<p>A paragraph for the main content.</p>
<p>And another one.</p>

<p slot="footer">Here's some contact info</p>
</base-layout>

我們還是可以保留一個未命名插槽,這個插槽是默認插槽,也就是說它會作為所有未匹配到插槽的內容的統一出口。上述兩個示例渲染出來的 HTML 都將會是:

<div class="container">
<header>
<h1>Here might be a page title</h1>
</header>
<main>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
</main>
<footer>
<p>Here's some contact info</p>
</footer>
</div>

默認插槽的內容

有的時候為插槽提供默認的內容是很有用的。例如,一個?<submit-button>?組件可能希望這個按鈕的默認內容是“Submit”,但是同時允許用戶覆寫為“Save”、“Upload”或別的內容。

你可以在?<slot>?標簽內部指定默認的內容來做到這一點。

<button type="submit">
<slot>Submit</slot>
</button>

如果父組件為這個插槽提供了內容,則默認的內容會被替換掉。

編譯作用域

當你想在插槽內使用數據時,例如:

<navigation-link url="/profile">
Logged in as {{ user.name }}
</navigation-link>

該插槽可以訪問跟這個模板的其它地方相同的實例屬性 (也就是說“作用域”是相同的)。但這個插槽不能訪問?<navigation-link>?的作用域。例如嘗試訪問?url?是不會工作的。牢記一條準則:

父組件模板的所有東西都會在父級作用域內編譯;子組件模板的所有東西都會在子級作用域內編譯。

作用域插槽

2.1.0+ 新增

有的時候你希望提供的組件帶有一個可從子組件獲取數據的可復用的插槽。例如一個簡單的?<todo-list>?組件的模板可能包含了如下代碼:

<ul>
<li
v-for="todo in todos"
v-bind:key="todo.id"
>
{{ todo.text }}
</li>
</ul>

但是在我們應用的某些部分,我們希望每個獨立的待辦項渲染出和?todo.text?不太一樣的東西。這也是作用域插槽的用武之地。

為了讓這個特性成為可能,你需要做的全部事情就是將待辦項內容包裹在一個?<slot>?元素上,然后將所有和其上下文相關的數據傳遞給這個插槽:在這個例子中,這個數據是?todo?對象:

<ul>
<li
v-for="todo in todos"
v-bind:key="todo.id"
>
<!-- 我們為每個 todo 準備了一個插槽,-->
<!-- 將 `todo` 對象作為一個插槽的 prop 傳入。-->
<slot v-bind:todo="todo">
<!-- 回退的內容 -->
{{ todo.text }}
</slot>
</li>
</ul>

現在當我們使用?<todo-list>?組件的時候,我們可以選擇為待辦項定義一個不一樣的?<template>?作為替代方案,并且可以通過?slot-scope?特性從子組件獲取數據:

<todo-list v-bind:todos="todos">
<!-- 將 `slotProps` 定義為插槽作用域的名字 -->
<template slot-scope="slotProps">
<!-- 為待辦項自定義一個模板,-->
<!-- 通過 `slotProps` 定制每個待辦項。-->
<span v-if="slotProps.todo.isComplete">?</span>
{{ slotProps.todo.text }}
</template>
</todo-list>

在 2.5.0+,slot-scope?不再限制在?<template>?元素上使用,而可以用在插槽內的任何元素或組件上。

解構?slot-scope

如果一個 JavaScript 表達式在一個函數定義的參數位置有效,那么這個表達式實際上就可以被?slot-scope?接受。也就是說你可以在支持的環境下 (單文件組件或現代瀏覽器),在這些表達式中使用?ES2015 解構語法。例如:

<todo-list v-bind:todos="todos">
<template slot-scope="{ todo }">
<span v-if="todo.isComplete">?</span>
{{ todo.text }}
</template>
</todo-list>

這會使作用域插槽變得更干凈一些。

轉載于:https://www.cnblogs.com/e493825156/p/9034395.html

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

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

相關文章

圖片與二進制流轉換

#region//圖片轉換為二進制流 public void PictureToBinaryStream() { //獲取當前程序運行路徑 string path Application.StartupPath; //拼接成測試圖片路徑 string fullPath path "\\images\\test.png"; //初始化類 Bitmap bmp…

仿MIUI彈性列表

前言 最近去小米之家體驗了下小米9&#xff0c;發現MIUI有一個挺特別的列表動畫效果&#xff0c;在系統上的各種應用上都能見到它的身影。 網上查了下&#xff0c;小米早在幾個系統版本前就有這個&#xff0c;網上也有了實現這個效果的控件庫。實現方法大同小異&#xff0c;大多…

10、angular的全部api

1、lowercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.lowercase(AbCdEf))}); 2、uppercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.uppercas…

JavaScript快速入門-ECMAScript本地對象(String)

一、String對象 String對象和python中的字符串一樣&#xff0c;也有很多方法&#xff0c;這些方法大概分為以下種類&#xff1a; 1、索引和查找 1、charAt() 返回指定位置的字符。 2、charCodeAt() 返回指定位置的字符的 Unicode 編碼。這個返回值是 0 - 65535 之間的整數。 …

8、angular的select

1、數據源為數組 x for x in names第一個x代表在下拉框內顯示的數據 第二個x指的是在names里數據 <!DOCTYPE html><html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

ZOJ4116 Game on a Graph

給一個含n個點 m條邊的連通圖 把k個人分成兩組 輪流拿掉一條邊 當取走一條邊后圖不再連通 這個隊就輸了 水題啦 邊為n-1時 下一個拿掉邊的那個組就輸啦 AC代碼&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long ll;4 typedef unsigned lon…

集美大學1414班軟件工程個人作業2——個人作業2:APP案例分析

一、作業鏈接 個人作業2&#xff1a;APP案例分析 二、博文要求 通過分析你選中的產品&#xff0c;結合閱讀《構建之法》&#xff0c;寫一篇隨筆&#xff0c;包含下述三個環節的所有要求。 第一部分 調研&#xff0c; 評測 下載軟件并使用起來&#xff0c;描述最簡單直觀的個人第…

全局eslint不生效的處理

react項目里能用上 eslint 的 airbnb 規范真是的&#xff0c;對自己的編碼有很好的幫助&#xff0c;不經可以養成良好的代碼風格&#xff0c;而且還能檢測出 state或者變量 是否 使用過&#xff0c; 然而&#xff0c;所在團隊的小伙伴們&#xff0c;卻并未使用&#xff0c;或者…

IP通信基礎

源端口和目的端口字段--各占2字節。端口是傳輸層與應用層的服務接口。傳輸層的復用和分用功能都要通過端口才能實現。序號字段--占4字節。TCP連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號轉載于:https://www.…

回溯算法 ------回溯算法的幾個例子

1.回溯算法的小結 2.回溯算法的幾個例子 2.1 ------ 4后問題 搜索空間&#xff1a; 2.2 ------01背包問題 01背包問題的算法設計 01背包問題的實例分析 01背包問題的搜索空間 2.3 ------- 貨郎問題 貨郎問題實例 貨郎問題的搜索空間 最后再來個小結 轉載于:https://www.cnb…

Phaserjs V2的state狀態解析及技巧

用phaserjs開發了好多游戲了&#xff0c;但是對phaser還是了解不深&#xff0c;只知道怎么去用&#xff0c;今天就特意花點時間研究下phaser的狀態管理到底是怎么回事。 首先&#xff0c;new Phaser.Game&#xff0c;以下是Phaser.Game的部分源碼&#xff1a; Phaser.Game fun…

JAVA_出神入化學習路線大綱

注&#xff1a;參考GitHub上的項目&#xff08;toBeTopJavaer&#xff09;總結出來 也是自己的目標。 基礎篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899066.html 進階篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899841.html 高級篇&#xff1a;https://www…

Ubuntu安裝并使用sogou輸入法

1.下載搜狗輸入法的安裝包 下載地址為&#xff1a;http://pinyin.sogou.com/linux/ ,如下圖&#xff0c;要選擇與自己系統位數一致的安裝包&#xff0c;我的系統是64位&#xff0c;所以我下載64位的安裝包 2.按鍵CtrAltT打開終端&#xff0c;輸入以下命令切換到下載文件夾: [ht…

面試題之web

1. django和flask框架的區別&#xff1f; django&#xff1a;大而全的全的框架&#xff0c;重武器&#xff1b;內置很多組件&#xff1a;ORM、admin、Form、ModelForm、中間件、信號、緩存、csrf等 flask: 微型框架、可擴展強&#xff0c;如果開發簡單程序使用flask比較快速&am…

python 常用鏡像

pip鏡像https://pypi.tuna.tsinghua.edu.cn/simplehttps://pypi.douban.io.com/simple pip install python-qt -i https://pypi.tuna.tsinghua.edu.cn/simple清華開源軟件鏡像&#xff1a;&#xff08;anaconda&#xff09;https://mirrors.tuna.tsinghua.edu.cn/https://mirro…

flutter 幾秒前, 幾分鐘前, 幾小時前, 幾天前...

Show me the code!!! class RelativeDateFormat {static final num ONE_MINUTE 60000;static final num ONE_HOUR 3600000;static final num ONE_DAY 86400000;static final num ONE_WEEK 604800000;static final String ONE_SECOND_AGO "秒前";static final St…

CMake 使用筆記

記錄 CMake 相關知識。 Prelude&#xff1a;讀文檔一定要有耐心&#xff01; 問題一 CLion&#xff1a; CMakeLists.txt 中 set(CMAKE_CXX_FLAGS -Wall) 不起作用 Solution: 改用 target_compile_options(main PUBLIC -Wall) Reference:target_compile_optionsGCC: Options to …

Docker 完全指南

Docker 最初 dotCloud 公司內部的一個業余項目Docker 基于 Go 語言Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案Docker 的基礎是 Linux 容器&#xff08;LXC&#xff09;等技術Docker 容器的啟動可以在秒級實現&#xff0c;這相比傳統的虛擬機方式要快得多Docker 對…

NOIP 2016【蚯蚓】

好吧&#xff0c;我承認我是個智障…… 這道題一眼看上去就是個堆&#xff0c;然而實際上有單調性。 注意到&#xff0c;如果 \(q 0\) 的話&#xff0c;將蚯蚓的左右兩邊分開丟進兩個隊列中&#xff0c;則兩個隊列都是單調不增的&#xff0c;因為每次取出的蚯蚓長度單調不增。…

Ajax異步(客戶端測試)

客戶端測試&#xff1a;GET方法實現Ajax異步 var request new XMLHttpRequest(); request.open("GET","sever.php?number" document.getElementById("keyword").value); request.send(); request.onreadystatechange function(){ if(request.…