插槽slot

slot 一個預留的空間

<slot></slot>

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QRgE9cX5-1582847892207)(FF46D34EA2F04F3C8044A14E4FA6A266)][外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-R73LkhEA-1582847892209)(1FF6E692A9344846B9D00AFA74A8100B)][外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-H2mNk6Of-1582847892210)(69A14CC8FF5D4802A584C633A7E02F5D)]

如何封裝這類組件呢?
  • 抽取共性,保留不同。
  1. 最好的封裝方式就是將共性抽取到組件中,將不同暴露爲插槽
  2. 一旦我們預留了插槽,就可以讓使用者根據自己的需求,決定插槽中插入什麼內容
  3. 是搜索框,是文字,還是菜單。由調用者自己來決定
  <template id="cpn">
    <div>
      <h2>我是組件</h2>
      <p>我是組件2</p>
      <slot></slot>
    </div>

這樣這個slot就是留的位置了

  <div id="app">
    <cpn><button>按鈕</button></cpn>
    <cpn><span>哈哈哈</span></cpn>
  </div>
  • 在實例中直接在裏邊寫入button 和span
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Nm1joVHh-1582847892212)(CB926467D0F2436DBA31C5E5D1B1AF6F)]

插槽的第二種用法:設置默認值

<slot><button>給插槽設置默認值</button></slot>
  • 在沒有設置的情況下,默認值爲button
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cwlrRs0p-1582847892213)(00EFD0EC783E4C05AFE59846C67BC690)]
  • 如果在插槽中有多個值,將一起作爲替換元素

具名插槽

  <template id="cpn">
    <div>
      <slot name="left"><button>按鈕</button></slot>
      <slot name="center"><span>哈哈</span></slot>
      <slot name="right"><input type="text"></slot>
    </div>
  </template>
  • 給插槽設置name,調取時候將要替換的元素設置slot屬性
<div id="app">
    <cpn><span slot="left">替換</span></cpn>
  </div>

編譯作用域

<div id="app">
    <cpn v-show='' v-for=(item in names)></cpn>
</div>

<template id="cpn">
    <div>
      <h2>我是子組件</h2>
      <p>我是內容</p>
      <button v-show='' v-for=''>anniu </button>
    </div>
  </template>
  • 在哪裏就用哪裏的域

插槽作用域

  • 父組件替換插槽的標籤,子組件提供插槽的內容
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UEGWCspK-1582847892214)(1813E4307910407498880D6D92B7DB2A)]
//子組件
data(){
            return {
              pLanguage:['java','javaScript','c++','python']
            }
          }

-子組件模板

<template id="cpn">
    <div>
      <slot :data="pLanguage">
        <ul>
          <li v-for="item in pLanguage">{{item}}</li>
        </ul>
      </slot>
    </div>
  </template>

-用一對slot動態綁定一個屬性,然後再父組件裏用slot-scope傳值就可以使用了

父組件
<div id="app">
   <cpn>
     <template slot-scope="dataApp">
       <span v-for="item in dataApp.data">{{item}} </span>
     </template>
   </cpn>
 </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章