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

2020-12-04 智能甄選

一、什麼是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>' +'<div>' +'<slot name="header"></slot>' +'</div>' +'<div>' +'<slot></slot>' +'</div>'+'<div>' +'<slot name="footer"></slot>' +'</div>'+'</div>'});var app17 = new Vue({el: '#app17'});

渲染結果為:

<div id="app17"><div><div><h3>標題</h3></div><div><p>正文內容</p><p>更多正文內容</p></div><div><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><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 。

相關焦點

  • slot vue 具名專題及常見問題 - CSDN
    vue的slot1、什麼是slotslot是插槽,插即是可以插入,槽就是坑,即是可以再代碼中插入如果子組件模板中不包含插口,那麼父組件的內容將會被丟棄。當子組件模板中有一個麼有屬性的插槽時,父組件傳入的整個內容片段,將插入到插槽所在的dom的位置,並替換掉插槽標籤本身。
  • table vue插槽的使用 - CSDN
    但是插槽顯示的位置卻由子組件自身決定,slot寫在組件template的什麼位置,父組件傳過來的模板將來就顯示在什麼位置。1、插槽內容  vue實現了一套內容分發的api,將 slot 元素作為承載內容分發的出口。  插槽內可以包含任何模板代碼,包括html,以及其他組件。
  • Vue之插槽(slot)
    插槽簡述和作用(一對一)官宣:<slot>元素作為承載分發內容的出口。簡單的說其實就是一個組件留的一個可擴張的輸出功能,用一個簡單的示例就明白了通過上面的代碼,相信大家也簡單的明白了插槽的含義了吧。就是「內部」的補充。比如圖標定義,動態內容定義,都可以通過slot的方法來完成。
  • vue 具名插槽詳解專題及常見問題 - CSDN
    插槽含義:就是引入子組件後,在插入子組件元素中添加信息或者標籤,使得子組件的指定位置插入信息或者標籤插槽有三種:默認插槽、具名插槽、作用域插槽,由於vue2.6.0後對插槽進行修改,但是兼容2.6.0前的版本,博文中只說明2.6.0後的插槽,vue3.0後面會去除2.60前的版本兼容  一、默認插槽<
  • vue.js初入門(十一組件-下篇)
    在簡單的場景下,使用一個空的 Vue 實例作為中央事件總線:使用 Slots 分發內容在使用組件時,常常要像這樣組合它們:注意兩點:<app> 組件不知道它的掛載點會有什麼內容。Vue.js 實現了一個內容分發 API ,參照了當前 Web組件規範草案,使用特殊的 <slot> 元素作為原始內容的插槽。編譯作用域在深入內容分發 API 之前,我們先明確內容的編譯作用域。
  • vue 作用域插槽的使用專題及常見問題 - CSDN
    我將這個概念理解為:子組件的插槽要在父組件裡使用子組件內部的數據,可以靈活的渲染子組件的dom結構以及數據。emmmm,可能有點繞,但是舉例:設想一個帶有如下模板的 <current-user> 組件:<span> <slot>{{ user.name}}</slot></span>我們可能想換掉備用內容,用性別而不是姓名顯示。
  • slot vue 用法專題及常見問題 - CSDN
    Vue 實現了一套內容分發的 API,將 <slot> 元素作為承載分發內容的出口。可以理解為模板中的佔位符, 在實例化時用自定義標籤元素替代.本文基於Vue 2.0 最新語法.slot 的用法大概分為三種:一.
  • template標籤 vue 作用專題及常見問題 - CSDN
    ="header">標題信息</p> <p>主要內容1</p> <p>主要內容2</p> <p slot="footer">底部信息信息</p> </base-layout> <base-layout
  • 如何寫一個vue組件專題及常見問題 - CSDN
    如何使用vue寫一個組件庫新建vue項目使用vue-cli初始化一個項目:vue init webpack VueComponentcd VueComponentnpm installnpm run dev以上就新建好了一個vue項目項目目錄首先,定義好目錄,經過觀察大多數的組件庫,基本是這樣的目錄
  • vue高級進階系列——用typescript玩轉vue和vuex
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • 4種可用於組織大型Vue.js項目的最佳實踐
    1.使用Vue Slots使代碼易於理解父子關係是組件之間相互連接的最常用方法之一,但有時這可能並不是最佳選擇。想像一下,如果出現在單個父組件中有大量子組件的情況,那麼可能就不得不使用大量道具和發出事件來處理這些子組件,很快一切會變得一團糟。這就是在大型項目中將要面臨的真實情況,不過,Vue.js可以提供針對此問題的現場解決方案。
  • vue-mapvgl v0.0.10 發布,基於 Vue 2.0 和百度地圖的地圖組件
    vue-mapvgl v0.0.10 已經發布,此版本更新內容包括:vue-mapvgl是一套基於Vue 2.0和百度地圖mapvgl的地圖組件。
  • 供我們選擇的 Vue 組件庫還有很多!
    特別是微信 H5 開發的朋友,這款組件庫的 UI 是基於微信官方樣式設計的,十分貼合,建議使用。相關開源項目:vux2.5-webapp:一個基於 vux 開發的商城項目。vue2-vux-fitness-project:一個基於 vux 開發的種子項目,同學們可以拿這個項目作為啟動項目。vue-music:vux + vue 仿網抑雲音樂項目。
  • Particle Effect for Vue
    演示地址Vue Particle Effect Buttons安裝教程將 particle-effect.vue 複製到你的項目目錄中,自行修改適配。particles-amount-coefficient="3"    :oscillation-coefficient="20"    @begin="onBegin"    @complete="onComplete"  >    BUTTON CONTENT GOES HERE  </ParticleEffect></template>ParticleEffect組件中
  • Vue全家桶之什麼是Vuex
    它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 是幹什麼的?試想一下,如果在一個項目開發中頻繁的使用組件傳參的方式來同步data中的值,一旦項目變得很龐大,管理和維護這些值將是相當棘手的工作。為此,Vue為這些被多個組件頻繁使用的值提供了一個統一管理的工具——VueX。
  • 在vue項目中使用vuex實現狀態管理的案例
    說明:其實如果項目不是很龐大很複雜,沒有涉及到很多狀態值需要被很多頁面或組件共用;或者某個頁面或組件的行為會對其他頁面或組件造成依賴性的影響。並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。準備工作:a.在vue項目中安裝vuex: npm install vuex -S。b.了解下vuex的五個屬性。
  • 什麼是VUE?VUE與JS的對比
    概念vue是一個構建用戶界面的框架(庫),它的目標是通過儘可能簡單的api實現響應的數據綁定和組合的視圖集合 vue自身不是一個全能框架的核心是只關注視圖層,因此它非常容易學習,非常容易與其它庫或已有項目整合 vue在與相關工具和支持庫一起使用時, 也能完美地驅動複雜的單頁應用
  • 如何在vue項目中使用sass並設置元素樣式
    elementJavaScriptsassCSS3 在創建vue框架項目時,可以使用CSS3定義元素樣式;還可以使用sass動態變量定義元素樣式如果直接使用sass,啟動項目會出現報錯。那麼,如何在vue項目中使用sass?
  • ref vue 獲取文本專題及常見問題 - CSDN
    -- 設置dom元素,設置ref屬性 --><h3 ref="test_h3">dom元素中的內容</h3><!-- 在Vue方法中調用使用`this.$refs`來獲取dom元素 -->this.
  • Vuex你從沒使用過的優化方案!
    儘管儀錶板將僅由一小部分用戶和應用程式的受限區域(假設在/admin路徑下)使用,由於靜態Vuex模塊的集中註冊,它的所有代碼都將在主程序包中。所以這肯定不是我們想要的結果,我們更加希望每個Vuex模塊模塊的註冊是根據頁面大的分類路由模塊來註冊的,這樣就能夠不是在程序初始化的時候就被加載。並且可以將其打包在不同的代碼塊中,或者在需要時懶加載。這個時候動態模塊就可以幫到我們了!