插槽

Pipe Piper發表於2020-12-17

插槽(slot)

元件插槽的目的是為了讓我們封裝的元件具有更好的擴充套件性

在開發中一般會在元件中新增slot標籤,就像電腦裡面空一個記憶體插槽一樣,以備不時之需。例如淘寶京東的上方搜尋導航欄(抽取共性,保留不同)這裡的不同就通過slot來實現

具名插槽

// 元件
Vue.component('lv-hello', {
  template: `
    <div>
      <slot name="header"></slot>
      <h1>我的天呀</h1>
    </div>
  `
})
<div id="app">
  <!-- 老版本使用具名插槽 -->
  <lv-hello>
    <p slot="header">我是頭部</p>
  </lv-hello>
  <!-- 新版本使用具名插槽 -->
  <lv-hello>
    <!-- 注意:這塊的 v-slot 指令只能寫在 template 標籤上面,而不能放置到 p 標籤上 -->
    <template v-slot:header>
      <p>我是頭部</p>
    </template>
  </lv-hello>
</div>

具名插槽的縮寫

v-slot: 替換成 #

<div id="app">
  <lv-hello>
    <template #header>
      <p>我是頭部</p>
    </template>
    <!-- 注意: #號後面必須有引數,否則會報錯。即便是預設插槽,也需要寫成 #default -->
    <template #default>
      <p>我是預設插槽</p>
    </template>
  </lv-hello>
</div>

作用域插槽

所謂作用域插槽,就是讓插槽的內容能夠訪問子元件中才有的資料。

Vue.component('lv-hello', {
  data: function () {
    return {
      firstName: '張',
      lastName: '三'
    }
  },

  template: `
    <div>
      <slot name="header" :firstName="firstName" :lastName="lastName"></slot>
      <h1>我的天呀</h1>
    </div>
  `
})
<div id="app">
  <!-- 老版本使用具名插槽 -->
  <lv-hello>
    <p slot="header" slot-scope="hh">我是頭部 {{ hh.firstName }} {{ hh.lastName }}</p>
  </lv-hello>
  <!-- 新版本使用具名插槽 -->
  <lv-hello>
    <!-- 注意:這塊的 v-slot 指令只能寫在 template 標籤上面,而不能放置到 p 標籤上 -->
    <template v-slot:header="hh">
      <p>我是頭部 {{ hh.firstName }} {{ hh.lastName }}</p>
    </template>
  </lv-hello>
</div>

相關文章