vue組件詳解(四)——使用slot分發內容

来源:https://www.cnblogs.com/chaixiaozhi/archive/2018/04/09/8747967.html
-Advertisement-
Play Games

一、什麼是slot 在使用組件時,我們常常要像這樣組合它們: 當需要讓組件組合使用,混合父組件的內容與子組件的模板時,就會用到slot , 這個過程叫作內容分發( transclusion )。 註意兩點: 1.< app>組件不知道它的掛載點會有什麼內容。掛載點的內容是由<app >的父組件決定的 ...


一、什麼是slot

在使用組件時,我們常常要像這樣組合它們:

<app>
  <app-header></app-header>
  <app-footer></app-footer>
</app>

當需要讓組件組合使用,混合父組件的內容與子組件的模板時,就會用到slot , 這個過程叫作內容分發( transclusion )。

註意兩點:

1.< app>組件不知道它的掛載點會有什麼內容。掛載點的內容是由<app >的父組件決定的。

2.<app> 組件很可能有它自己的模板。

props 傳遞數據、events 觸發事件和slot 內容分發就構成了Vue 組件的3 個API 來源,再複雜的組件也是由這3 部分構成的。

 

 二、作用域

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

這裡的message 就是一個slot ,但是它綁定的是父組件的數據,而不是組件<child-component>的數據。

父組件模板的內容是在父組件作用域內編譯,子組件模板的內容是在子組件作用域內編譯。如:

        <div id="app15">
            <child-component v-show="showChild"></child-component>
        </div>
Vue.component('child-component',{
    template: '<div>子組件</div>'
});

var app15 =  new Vue({
   el: '#app15',
   data: {
        showChild: true
    }
});

這裡的狀態showChild 綁定的是父組件的數據,如果想在子組件上綁定,那應該是:

       <div id="app15">
            <child-component></child-component>
        </div>
Vue.component('child-component',{
    template: '<div v-show="showChild">子組件</div>',
    data: function(){
        return {
            showChild: true
        }
    }
});

因此, slot 分發的內容,作用域是在父組件上的。

 

三、slot用法

3.1 單個slot

在子組件內使用特殊的<slot>元素就可以為這個子組件開啟一個slot(插槽),在父組件模板里,插入在子組件標簽內的所有內容將替代子組件的<slot> 標簽及它的內容。

        <div id="app16">
            <my-component16>
                <p>分發的內容</p>
                <p>更多分發的內容</p>
            </my-component16>
        </div>
Vue.component('my-component16',{
    template: '<div>' +
                '<slot><p>如果父組件沒有插入內容,我將作為預設出現<</p></slot>' +    //預留的slot插槽
             '</div>'
});

var app16 =  new Vue({
    el: '#app16'
});

渲染結果為:

<div id=”app16”>
    <div>
        <p>分發的內容<p>
        <p>更多分發的內容<p>
    </div>
</div>        

 子組件child-component 的模板內定義了一個<slot>元素,並且用一個<p>作為預設的內容,在父組件沒有使用slot 時,會渲染這段預設的文本;如果寫入了slot, 那就會替換整個<slot> 。

 

3.2具名slot

給<slot> 元素指定一個name 後可以分發多個內容,具名Slot 可以與單個slot 共存。

        <div id="app17">
            <my-component17>
                <h3 slot="header">標題</h3>
                <p>正文內容</p>
                <p>更多正文內容</p>
                <h3 slot="footer">底部信息</h3>
            </my-component17>
        </div>
Vue.component('my-component17',{
    template: '<div class="container">' +
                 '<div class="header">' +
                    '<slot name="header"></slot>' +
                 '</div>' +
                 '<div class="main">' +
                    '<slot></slot>' +
                 '</div>'+
                 '<div class="footer">' +
                    '<slot name="footer"></slot>' +
                 '</div>'+
              '</div>'
});

var app17 =  new Vue({
    el: '#app17'
});

渲染結果為:

            <div id="app17">
                <div class="container">
                    <div class="header">
                        <h3>標題</h3></div>
                    <div class="main"> 
                        <p>正文內容</p> 
                        <p>更多正文內容</p> 
                    </div>
                    <div class="footer">
                        <h3>底部信息</h3>
                    </div>
                </div>
            </div>

 子組件內聲明瞭3 個<s lot>元素,其中在<div class=” main >內的<slot> 沒有使用name 特性,它將作為預設slot 出現,父組件沒有使用slot 特性的元素與內容都將出現在這裡。

如果沒有指定預設的匿名slot ,父組件內多餘的內容片段都將被拋棄。

 

四、作用域插槽

作用域插槽是一種特殊的slot ,使用一個可以復用的模板替換己渲染元素。

看一個例子:

        <div id="app18">
            <my-component18>
                <template scope="props">
                    <p>來自父組件的內容</p>
                    <p>{{props.msg}}</p>
                </template>
            </my-component18>
        </div>
Vue.component('my-component18',{
    template: '<div class="container"><slot msg="來自子組件的內容"></slot></div>'
});

var app18 =  new Vue({
    el: '#app18'
});

渲染結果為:

<div id=”app18”>
    <div class=”container”>
        <p>來組父組件的內容</p>
        <p>來自子組件的內容</p>
    </div>
</div>

觀察子組件的模板,在<slot>元素上有一個類似props 傳遞數據給組件的寫法msg=” xxx ”,將數據傳到了插槽。

父組件中使用了<template>元素,而且擁有一個scope=”props ”的特性,這裡的props只是一個臨時變數,就像v-for= ” item in items 裡面的item 一樣,template 內可以通過臨時變數props訪問來自子組件插槽的數據msg 。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spark http://spark.apache.org/ http://spark.apache.org/docs/latest/ http://spark.apache.org/docs/2.2.0/quick-start.html http://spark.apache.org/docs/2 ...
  • 在我們使用MySQL資料庫時,字元亂碼,對我們來說是一個很頭疼的問題。今天筆者就來教大家如何徹底解決更改預設字元集以及字元亂碼問題。 當我們使用壓縮包進行MySQL安裝後,系統會使用預設的字元集,這時就會產生亂碼。 方案: 來到MySQL安裝路徑下,創建一個my.ini文件(如果有my-defaul ...
  • 1.1 SQL概述 1.1.1 SQL語句介紹 結構化查詢語言(Structured Query Language)簡稱SQL,是關係型資料庫管理系統都需要遵循的規範。不同的資料庫生產廠商都支持SQL語句,但都有特有內容。 1.1.2 SQL語句分類 SQL分類: 數據定義語言:簡稱DDL(Data ...
  • 在升級一個SQL Server 2000的資料庫時,遇到了一致性錯誤,其中有幾個錯誤是元數據損壞(metadata corruption),特意研究了一下這個案例,因為以前也零零散散的遇到過一些一致性相關錯誤,但是難得遇到元數據損壞的案例。 如下所示,資料庫從SQL Server 2000還原到SQ... ...
  • 在實現一個問題的時候,同樣的結果我寫了兩個sql。 sql1 sql2 在效率問題上詢問了前輩,得到的建議是使用第二個,因為分組跟子查詢都會影響效率,相比之下分組好一點。 另外產生的一個問題是,如果使用.net並使用c#語言實現sql的話,第一個sql是無法(在我的能力範圍內)使用拉姆達查詢對象的, ...
  • 資料庫的三大特性可謂是:實體屬性和關係。 實體:表; 屬性:表中的數據(欄位); 關係:表與表之間的關係。 資料庫設計三大範式(重點): 第一範式(1NF):數據表中的每一列(每個欄位)必須是不可拆分的最小單元,也就是確保每一列的原子性; 第二範式(2NF):滿足1NF後,要求表中的所有列,都必須依 ...
  • 一、用Log列印日誌 二、Toast用法 三、在活動中使用Menu 首先在res目錄下新建menu文件夾,接著在這個文件夾下新建一個名叫main的菜單文件,在main.xml中添加如下代碼 回到Activity中重寫onCreateOptionsMenu()方法,編寫如下代碼(返回true表示允許創 ...
  • 一、view鉤子 view鉤子有2個,ngAfterViewInit和ngAfterViewChecked鉤子。 1、實現ngAfterViewInit和ngAfterViewChecked鉤子時註意事項 以父組件調用子組件方法 中例子為基礎,在父組件中實現ngAfterViewInit和ngAft ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...