目錄
前面的話
編譯作用域
預設丟棄
作用域插槽
首頁 web前端 js教程 Vue內容分發slot

Vue內容分發slot

Aug 19, 2017 am 10:13 AM
slot 內容 散佈

前面的話

  為了讓元件可以組合,需要一種方式來混合父元件的內容與子元件自己的模板。這個過程被稱為 內容分發 (或 “transclusion” )。 Vue實作了一個內容分發 API,參考了目前 Web 元件規範草案,使用特殊的 <slot> 元素作為原始內容的插槽。本文將詳細介紹Vue內容分發slot

編譯作用域

  在深入內容分發 API 之前,先先明確內容在哪個作用域裡編譯。假定模板為

<child-component>
  {{ message }}
</child-component>
登入後複製

  message 應該綁定到父元件的數據,還是綁定到子元件的數據?答案是父元件。元件作用域簡單來說是:父元件模板的內容在父元件作用域內編譯;子元件模板的內容在子元件作用域內編譯。

  一個常見錯誤是試圖在父元件範本內將一個指令綁定到子元件的屬性/方法:

<!-- 无效 -->
<child-component v-show="someChildProperty"></child-component>
登入後複製

  假定someChildProperty是子元件的屬性,上例不會如預期般運作。父元件範本不應該知道子元件的狀態

  如果要綁定作用域內的指令到一個元件的根節點,應當在元件自己的範本上做:

#
Vue.component('child-component', {
  // 有效,因为是在正确的作用域内
  template: '<p v-show="someChildProperty">Child</p>',
  data: function () {
    return {
      someChildProperty: true
    }
  }
})
登入後複製

  類似地,分發內容是在父作用域內編譯

 

預設丟棄

  一般地,如果子元件範本不包含<slot>插口,父元件的內容將會被丟棄

var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <p>测试内容</p>
    </child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製
登入後複製

<p id="example">
  <parent></parent></p><script src="https://unpkg.com/vue"></script><script>var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
  </p>  `,
};var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <p>测试内容</p>
    </child>
  </p>  `,
  components: {    'child': childNode
  },
};// 创建根实例new Vue({
  el: '#example',
  components: {    'parent': parentNode
  }
})</script>
登入後複製

  如下圖所示,所包含的

測試內容

丟棄

 

 

## 

#匿名slot

  當子元件範本只有一個沒有屬性的slot 時,父元件整個內容片段會插入到slot 所在的DOM 位置,並取代掉slot 標籤本身

var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
    <slot></slot>
  </p>
  `,
};
登入後複製

var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <p>测试内容</p>
    </child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製
登入後複製

#  如果出現多於1個的匿名slot,vue將報錯

var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
    <slot></slot>
    <slot></slot>
  </p>
  `,
};
登入後複製

【預設值】

  最初在

<slot>

標籤中的任何內容都被視為

備用內容

,或稱為預設值。備用內容在子元件的作用域內編譯,並且只有在宿主元素為空,且沒有要插入的內容時才顯示備用內容

  當slot存在預設值,且父元素在中沒有要插入的內容時,顯示預設值

var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
    <slot><p>我是默认值</p></slot>
  </p>
  `,
};
var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child></child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製

#  當slot存在預設值,且父元素在< child>當中存在要插入的內容時,則顯示設定值<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var childNode = {   template: `  &lt;p class=&quot;child&quot;&gt;     &lt;p&gt;子组件&lt;/p&gt;     &lt;slot&gt;&lt;p&gt;我是默认值&lt;/p&gt;&lt;/slot&gt;   &lt;/p&gt;   `, }; var parentNode = {   template: `  &lt;p class=&quot;parent&quot;&gt;     &lt;p&gt;父组件&lt;/p&gt;     &lt;child&gt;       &lt;p&gt;我是设置值&lt;/p&gt;     &lt;/child&gt;   &lt;/p&gt;   `,   components: {     'child': childNode   }, };</pre><div class="contentsignin">登入後複製</div></div>

## 

具名Slot

  <slot>

元素可以用一個特殊的屬性name

來設定如何分發內容。多個 slot 可以有不同的名字。具名slot 將符合內容片段中有對應

slot 特性的元素

#

var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
    <slot name="my-header">头部默认值</slot>
    <slot name="my-body">主体默认值</slot>
    <slot name="my-footer">尾部默认值</slot>
  </p>
  `,
};
登入後複製

##
var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <p slot="my-header">我是头部</p>
      <p slot="my-footer">我是尾部</p>
    </child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製

#  仍然可以有一個匿名slot,它是預設slot

,作為找不到匹配的內容片段的備用插槽。匿名slot只能作為沒有slot屬性的元素的插槽,有slot屬性的元素如果沒有配置slot,則會被拋棄

###
var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
    <slot name="my-body">主体默认值</slot>
    <slot></slot>
  </p>
  `,
};
登入後複製
############
var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <p slot="my-body">我是主体</p>
      <p>我是其他内容</p>
      <p slot="my-footer">我是尾部</p>
    </child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製
登入後複製
#########  

插入中,

我是其他內容

插入<slot>中,而

被丟棄##############  如果沒有預設的slot,這些找不到符合的內容片段也會被拋棄#########

var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
    <slot name="my-body">主体默认值</slot>
  </p>
  `,
};
登入後複製
#############
var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <p slot="my-body">我是主体</p>
      <p>我是其他内容</p>
      <p slot="my-footer">我是尾部</p>
    </child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製
登入後複製
#########  

我是其他內容

都被拋棄############### ####

作用域插槽

  作用域插槽是一种特殊类型的插槽,用作使用一个 (能够传递数据到) 可重用模板替换已渲染元素。

  在子组件中,只需将数据传递到插槽,就像将 props 传递给组件一样

<p class="child">
  <slot text="hello from child"></slot></p>
登入後複製

  在父级中,具有特殊属性 scope<template> 元素必须存在,表示它是作用域插槽的模板。scope 的值对应一个临时变量名,此变量接收从子组件中传递的 props 对象

var childNode = {
  template: `  <p class="child">
    <p>子组件</p>
      <slot xxx="hello from child"></slot>
  </p>
  `,
};
var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <template scope="props">
        <p>hello from parent</p>
        <p>{{ props.xxx }}</p>
      </template>
    </child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製

  如果渲染以上结果,得到的输出是

【列表组件】

  作用域插槽更具代表性的用例是列表组件,允许组件自定义应该如何渲染列表每一项

var childNode = {
  template: `  <ul>
    <slot name="item" v-for="item in items" :text="item.text">默认值</slot>
  </ul>
  `,
  data(){
    return{
      items:[
        {id:1,text:'第1段'},
        {id:2,text:'第2段'},
        {id:3,text:'第3段'},
      ]
    }
  }
};
登入後複製

var parentNode = {
  template: `  <p class="parent">
    <p>父组件</p>
    <child>
      <template slot="item" scope="props">
        <li>{{ props.text }}</li>
      </template>
    </child>
  </p>
  `,
  components: {
    'child': childNode
  },
};
登入後複製

 

以上是Vue內容分發slot的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1673
14
CakePHP 教程
1428
52
Laravel 教程
1333
25
PHP教程
1277
29
C# 教程
1257
24
如何在iPhone上啟用「敏感內容警告」並了解其功能 如何在iPhone上啟用「敏感內容警告」並了解其功能 Sep 22, 2023 pm 12:41 PM

特別是在過去十年中,行動裝置已成為與朋友和家人分享內容的主要方式。易於存取、易於使用的介面以及即時捕獲圖像和視訊的能力使其成為製作和共享內容的絕佳選擇。但是,惡意使用者很容易濫用這些工具來轉發不需要的敏感內容,這些內容可能不適合查看並未經您的同意。為了防止此類情況發生,iOS17中引入了具有「敏感內容警告」的新功能。讓我們來看看它以及如何在iPhone上使用它。新的「敏感內容警告」是什麼,它是如何運作的?如上所述,敏感內容警告是一項新的隱私和安全功能,旨在幫助防止用戶查看敏感內容,包括iPhone

Microsoft Edge瀏覽器開啟是360導航怎麼改-更改開啟是360導航的方法 Microsoft Edge瀏覽器開啟是360導航怎麼改-更改開啟是360導航的方法 Mar 04, 2024 pm 01:50 PM

怎麼更改MicrosoftEdge瀏覽器打開是360導航的頁面呢?其實很簡單,那麼現在小編就和大家一起分享關於更改MicrosoftEdge瀏覽器打開是360導航頁面的方法,有需要的朋友可以來看看哦,希望可以幫助大家。開啟MicrosoftEdge瀏覽器。我們看到是下圖這種頁面。點擊右上角的三點圖示。點選“設定”。在設定頁面的左側欄裡點選「啟動時」。點選右側欄裡的圖中示意的三點(不要能點選「開啟新標籤頁」),然後點選編輯,將網址改成「0」(或其他無意義的數字)。然後點選「儲存」。接下來,選擇“

Cheat Engine如何設定中文? Cheat Engine設定中文方法 Cheat Engine如何設定中文? Cheat Engine設定中文方法 Mar 13, 2024 pm 04:49 PM

  CheatEngine是一款遊戲編輯器,能夠對遊戲的記憶體進行編輯修改。但是它的預設語言是非中文的,對於很多小夥伴來說比較不方便,那麼CheatEngine怎麼設定中文呢?今天小編就跟大家詳細介紹一下CheatEngine設定中文的方法,希望可以幫助到你。  設定方法一  1、雙擊開啟軟體,點選左上角的「edit」。  2、接著點選下方選項清單中的「settings」。  3、在開啟的視窗介面中,點選左側欄中的“languages”

Microsoft Edge在哪設定顯示下載按鈕-Microsoft Edge設定顯示下載按鈕的方法 Microsoft Edge在哪設定顯示下載按鈕-Microsoft Edge設定顯示下載按鈕的方法 Mar 06, 2024 am 11:49 AM

大家知道MicrosoftEdge在哪設定顯示下載按鈕嗎?下文小編就帶來了MicrosoftEdge設定顯示下載按鈕的方法,希望對大家能夠有幫助,一起跟著小編來學習吧!第一步:先開啟MicrosoftEdge瀏覽器,點選右上角【...】標識,如下圖所示。步驟二:然後在彈出式選單中,點選【設定】,如下圖所示。第三步:接著點選介面左側【外觀】,如下圖所示。第四步:最後點選【顯示下載按鈕】右側按鈕,由灰變藍即可,如下圖所示。上面就是小編為大家帶來的MicrosoftEdge在哪設定顯示下載按鈕的

Python 程式碼變身獨立應用:PyInstaller 的煉金術 Python 程式碼變身獨立應用:PyInstaller 的煉金術 Feb 19, 2024 pm 01:27 PM

PyInstaller是一個開源程式庫,允許開發者將python程式碼編譯為平台無關的自包含可執行檔(.exe或.app)。它透過將Python程式碼、依賴項和支援檔案打包在一起來實現這一目標,從而創建獨立應用程序,無需安裝Python解釋器即可運行。 PyInstaller的優點在於它消除了對Python環境的依賴性,使應用程式可以輕鬆分發和部署給最終用戶。它還提供了建構器模式,使用戶可以自訂應用程式的設定、圖示、資源檔案和環境變數。使用PyInstaller打包Python程式碼安裝PyInstal

Python 應用的終極進化:PyInstaller 的破繭成蝶 Python 應用的終極進化:PyInstaller 的破繭成蝶 Feb 19, 2024 pm 03:27 PM

PyInstaller是一個革命性的工具,它賦予python應用程式超越其原始腳本形態的能力。透過將Python程式碼編譯成獨立的可執行文件,PyInstaller解鎖了程式碼分發、部署和維護的新境界。從單一腳本到強大應用程式以往,Python腳本只存在於特定的Python環境中。分發這樣的腳本需要使用者安裝Python和必要的函式庫,這是一個費時且繁瑣的過程。 PyInstaller引入了打包的概念,將Python程式碼與所有必要的依賴項組合成一個單獨的執行檔。代碼打包的藝術PyInstaller的工

時空中的繪旅人艾因的日常:常駐內容更新 時空中的繪旅人艾因的日常:常駐內容更新 Mar 01, 2024 pm 08:37 PM

時空中的繪旅人已經確定在2月29日更新之後,玩家可以和艾因一起去參加露天音樂節,獲得與艾因的好感度加成,3月4日將會開啟纓綺假日煦色韶光活動,玩家可以提升假日行程等級解鎖全新簡訊和Lofter內容。時空中的繪旅人艾因的日常:常駐內容更新更新2月29日版本後,可體驗全新校園日程[參加露天音樂節],跟艾因一起參與可獲得好感度加成。 3月4日09:30-4月15日05:00,在「纓綺假日·煦色韶光」活動期間提升[假日行程]等級到8級和28級,可分別解鎖全新短信和Lofter內容。 *新增簡訊、Lofter

解析 Solana 的 DEX 佈局:Jupiter 是不是生態的未來? 解析 Solana 的 DEX 佈局:Jupiter 是不是生態的未來? Mar 26, 2024 pm 02:10 PM

資料來源:深潮TechFlow作為Solana生態中備受矚目的新興項目,Jupiter儘管推出時間不長,卻已經在DeFi領域中迅速嶄露頭角。然而,即使在這樣快速發展的環境中,經濟模型的完善和代幣價格的穩定仍然至關重要。缺乏這些支撐,項目很容易陷入惡性循環,最終可能導致其衰落甚至無法為自身維持生機。因此,Jupiter需要不斷優化其經濟設計,確保代幣價格穩定性,以確保專案的長期發展和成功。 Solana鏈在最近一周表現強勁,其代幣SOL在二級市場上漲勢如虹,而Jupiter的代幣$JUP也在過去兩週內漲

See all articles