vue中的slot插槽怎麼用?

2020-12-13 0前端小咖0
vue中的slot插槽怎麼用?

當我們利用組件實現項目需求時,我們有時候會希望像html中其他標籤那樣,可以在使用組件時插入我們的自定義內容。例如下面這個場景:我們定義了一個叫「<input-component>」的組件,在組件的模板中,我們添加了一些<input>標籤:

js代碼

(為什麼我們不在模板內給它們一些<label>標籤或placeholder屬性作為內容提示呢?這是因為我們的目的是定義一個可以復用並能夠應用在不同地方的組件。)

我們需要在頁面顯示這個組件,並給出提示信息為:login。針對這樣的需求,如果我們直接在組件中間插入內容是無效的,login文本並不會被顯示出來。

html代碼

這個時候我們需要使用vue提供的slot插槽來解決。

基本使用與後備內容

插槽是vue自定義的一個<slot>元素,我們可以簡單地在模板內想要顯示我們自定義內容的地方插入<slot>標籤,當我們使用組件時,就會達到顯示自定義內容的效果。

html代碼
js代碼

如果我們想要在不插入自定義內容時候顯示默認內容,我們可以在<slot>內部自定義後備內容。例如:

html代碼
js代碼

編譯作用域

在理解編譯作用於之前,先讓我們看一下這段代碼:

html代碼
js代碼

當我們使用組件的時候,我們所插入的自定義內容可能包含某個數據,上面代碼中,我們插入的內容中訪問了父級組件的user數據,毫無疑問是可以的,因為這是在父級模板中的內容,所以是在父級作用域中編譯的。但如果此時我們訪問的是定義在<input-component>組件裡的title數據,結果是訪問不到的,因為這屬於在父級作用域訪問子組件作用域的數據。解決的辦法是利用作用域插槽(下文中有介紹)。

html代碼

具名插槽

我們也許會有插入多個內容的需求,並想把這些文本分模塊顯示在不同的部分,比如我們需要插入「header」「main」「footer」三個布局的內容,我們可以在模板中的指定部分分別插入<slot>標籤,為了區分,我們需要給這些插槽一個name的屬性,它們的值即是header、main、footer,這就是具名插槽。

js代碼

使用該組件時,我們需要利用<template>和v-slot指令來關聯位置,v-slot的參數為<slot>標籤中name屬性的值。這樣我們就可以將插入的內容傳入相應的插槽裡。

html代碼

如果我們還插入了其他內容,而這些內容沒有應用<template>和v-slot,則它們會被視為默認插槽(name=「default」)的內容。

html代碼

和v-bind或v-on一樣,對於v-slot也同樣存在簡寫的語法,我們可以使用「#」來代替該指令,不過需要注意的是,它不能直接賦值(關於為什麼賦值可以參考下一部分的作用域插槽)如果v-slot沒有參數,需要寫成#default="propObjectName"。

html代碼

作用域插槽

由於編譯作用域的限制,我們不能用插槽內容訪問子組件中的數據。但我們極有可能需要這樣的功能,所以vue中提供了作用域插槽來解決這個問題。

我們可以在slot中使用v-bind綁定一個自定義的屬性(例如下圖js代碼中的mytitle)來引入這個子組件數據(例如下圖js代碼中的title),然後在父組件中給v-slot指令賦值為一個自定義的對象變量(例如下圖html代碼中的slotProps),我們可以利用此對象變量顯示子組件中的數據(例如下圖html代碼中的slotProps.mytitle)。

ps:這跟利用Prop從父組件向下傳遞給子組件數據的方式有些相似之處。

html代碼
js代碼

作用域插槽原理是將插槽內容包裹在一個函數裡,而插槽prop名是這個函數的一個參數,結合上面的例子說明,就是slotProps是這個函數的參數。由於slotProps又是一個包含mytitle的對象,所以我們可以利用ES6的解構賦值語法,直接給v-slot傳遞mytitle而不使用slotProps:

html代碼
js代碼

相關焦點

  • slot-scope vue - CSDN
    前言vue 插槽,目前到3.0有2種方式,第一種,在2.6之前使用的是slot 和 slot-scpe 2.6後已被官方廢棄,但在2.x版本仍被支持,第二種是vue 在2.6版本後更新的新指令 v-slot 來替代slot 和slot-scpe那麼什麼是插槽呢,作用又是什麼插槽,簡單說,插槽就是杯子
  • slot vue 用法專題及常見問題 - CSDN
    從一個簡單的例子開始:// frame.vue這個組件最外層是一個div。假設div的存在是為了圍繞其內容創建一個樣式框架。這個組件可以通用地用於將框架包圍在wq你想要的任何內容上,來看看它是怎麼用的。這裡的frame組件指的是我們剛才做的組件。
  • slot vue 具名專題及常見問題 - CSDN
    vue的slot1、什麼是slotslot是插槽,插即是可以插入,槽就是坑,即是可以再代碼中插入如果子組件模板中不包含插口,那麼父組件的內容將會被丟棄。當子組件模板中有一個麼有屬性的插槽時,父組件傳入的整個內容片段,將插入到插槽所在的dom的位置,並替換掉插槽標籤本身。
  • 【Vue.js 入門到實戰教程】09-Vue 組件插槽 | 父子組件間的內容分發和插槽作用域
    關於組件嵌套、數據傳遞和事件通知學院君前面都已經介紹過了,回到插槽這個主題,我們可以通過 <slot></slot> 語法在子組件中渲染父級作用域定義的元素,從而實現嵌套組件之間的內容分發。
  • vue中組件的使用(下)
    vue中組件的使用(上)中,小編總結了組件的分類和註冊、組件的data選項、組件的props選項的使用,不過這只是組件基本內容的一小部分,在本篇文章中,大家可以了解到組件的模板、監聽子組件的事件、組件插槽、動態組件以及單文件組件的相關內容。
  • slot命名 vue - CSDN
    Slot使用1、組件中有單個或多個未命名slot標籤時,如下:<Child><span style=」color:red;」>hello world</span></Child>   <template>      <div&
  • 7個有用的 Vue開發技巧
    會通過 object.defineProperty對數據進行劫持,來實現視圖響應數據的變化,然而有些時候我們的組件就是純粹的數據展示,不會有任何改變,我們就不需要 vue來劫持我們的數據,在大量數據展示的情況下,這能夠很明顯的減少組件初始化的時間,那如何禁止 vue劫持我們的數據呢?
  • 7個有用的Vue開發技巧
    4 作用域插槽利用好作用域插槽可以做一些很有意思的事情,比如定義一個基礎布局組件A,只負責布局,不管數據邏輯。然後另外定義一個組件B 負責數據處理,布局組件A 需要數據的時候就去 B 裡面去取。這裡涉及到的一個最重要的點就是父組件要去獲取子組件裡面的數據,之前是利用 slot-scope。自 vue 2.6.0 起,提供了更好的支持 slot 和 slot-scope 特性的 API 替代方案。
  • 【Vue.js入門到實戰教程】11-Vue Loader(下)| 編寫一個單文件 Vue 組件
    編寫 ModalExample 組件我們將 vue_learning/component/slot.html 中的 modal-example 組件拆分出來,在 vue_learning/demo-project/src/components 目錄下新建一個單文件組件 ModalExample.vue,將 modal-example 組件代碼按照 Vue Loader 指定的格式填充到對應位置
  • 總結 Vue 知識體系之 12 個實用技巧
    動態給修改 dom 的樣式原因:因為我們在寫.vue 文件中的樣式都會追加 scoped。這樣針對模板 dom 中的樣式就可以生效,但其生效後的最終樣式並不是我們寫的樣式名,而是編碼後的。內容分發(slot)插槽 slot,也是組件的一塊 HTML 模板,這一塊模板顯示不顯示、以及怎樣顯示由父組件來決定。實際上,一個 slot 最核心的兩個問題在這裡就點出來了,是顯示不顯示和怎樣顯示。默認插槽又名單個插槽、匿名插槽,這類插槽沒有具體名字,一個組件只能有一個該類插槽。
  • 面試官:聊聊對Vue.js框架的理解
    那怎麼理解漸進式呢?漸進式含義:強制主張最少。漸進式概念Vue.js包含了聲明式渲染、組件化系統、客戶端路由、大規模狀態管理、構建工具、數據持久化、跨平臺支持等,但在實際開發中,並沒有強制要求開發者之後某一特定功能,而是根據需求逐漸擴展。
  • a標籤 href vue專題及常見問題 - CSDN
    作者 | Jeskson來源 | 達達前端小酒館什麼是插槽?插槽的指令為v-slot,它目前取代了slot和slot-scope,插槽內容,vue實例一套內容分發的api,將slot元素作為承載分發內容的出口。
  • Vue常見面試題攻略
    slot是什麼?有什麼作用?原理是什麼?slot又名插槽,是Vue的內容分發機制,組件內部的模板引擎使用slot元素作為承載分發內容的出口。插槽slot是子組件的一個模板標籤元素,而這一個標籤元素是否顯示,以及怎麼顯示是由父組件決定的。
  • template標籤 vue 作用專題及常見問題 - CSDN
    > <slot name='header'></slot> </header> <main> <slot></slot> </main> <footer> <
  • Vue 開發必須知道的 36 個技巧
    $children[0]) //獲取根實例的二級子組件}3.9 .sync在 vue@1.x 的時候曾作為雙向綁定功能存在,即子組件可以修改父組件中的值;在 vue@2.0 的由於違背單項數據流的設計被幹掉了;在 vue@2.3.0+ 以上版本又重新引入了這個 .sync 修飾符;
  • 2020大廠前端面試之vue專題
    理解:1.插槽:<app><div slot="a">xxxx</div><div slot="b">xxxx</div></app>slot name="a"slot name="b"創建組件虛擬節點時,會將組件的兒子的虛擬節點保存起來。
  • 詳解vue組件三大核心概念
    本文原載於SegmentFault專欄「前端工匠公眾號」作者:浪裡行舟整理編輯:SegmentFault本文主要介紹屬性、事件和插槽這三個vue基礎概念、使用方法及其容易被忽略的一些重要細節。寫通用組件時,props 最好用對象的寫法,這樣可以針對每個屬性設置類型、默認值或自定義校驗屬性的值,這點在組件開發中很重要,然而很多人卻忽視,直接使用 props 的數組用法,這樣的組件往往是不嚴謹的。
  • Vue.extend API(源碼級詳解)
    // 下次如果用再同一個extendOptions創建Sub時 // 就會直接從_Ctor返回 const cachedCtors = extendOptions.$slots[name] || fallback } return nodes}複製代碼這個函數就是從$scopedSlots中取到對應的插槽函數,然後執行這個函數,得到虛擬節點,然後返回虛擬節點,需要注意的是,Vue 在2.6.x版本中已經將普通插槽和作用域插槽都整合在了$scopedSlots,所有的插槽都是返回虛擬節點的函數,renderSlot
  • 如何寫一個vue組件專題及常見問題 - CSDN
    轉自:https://www.cnblogs.com/pengchenggang/p/10880437.html如何寫好一個vue組件一個適用性良好的組件,一種是可配置項很多,另一種就是容易覆寫,從而擴展功能Vue 組件的 API 來自三部分——prop、事件和插槽:prop 允許外部環境傳遞數據給組件event 允許從組件內觸發外部環境的副作用slot
  • 10個簡單的技巧讓你的 vue.js 代碼更優雅
    ,在Vue 2.6.0+中可用構建插槽與構建組件沒有什麼不同。本質上,插槽是具有超強功能的組件,讓我們細分一下上面的布局,組件的外觀如下:<!同樣可以適用於插槽綁定:<my-component><template v-slot:[slotName]>Dynamic slot name</template></my-component>//簡寫<foo><template #[name]>Default slot