天天看點

vue3 基礎-slot 插槽

slot 插槽的基本認識

前幾篇的内容都是父子元件通過屬性傳值或者事件傳值這樣的. 本篇來學習父元件在調用子元件時, 如果想要給子元件傳遞特定的内容 (dom) , 則可通過 slot 這個設計來輕易實作哦.

例如現在有這樣一個場景:

元件複用

<!DOCTYPE html>
<html lang="en">

<head>
  <title>元件複用</title>
  <script src="https://unpkg.com/vue@3"></script>
</head>

<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
      template: `
      <Son />
      <Son />
      `
    })

    app.component('Son', {
      methods: {
        handleClick () {
          alert(666)
        }
      },
      template: `
      <div>
        <input />
        <div @click="handleClick">送出</div>
      </div>
      `

    })
    
    const vm = app.mount('#root')

  </script>
</body>

</html>      

slot 初識

在父元件中, 調用了 2 次 Son 元件, 但咱希望第一次的是個 div, 第二次是個 button 的效果, 即可使用 slot 這種設計在父元件中調用子元件時給它 "增加内容":

<!DOCTYPE html>
<html lang="en">

<head>
  <title>slot</title>
  <script src="https://unpkg.com/vue@3"></script>
</head>

<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
      template: `
      <son>
        <div>送出</div>
      </son>
      <son>
        <button>送出</button>
      </son>
    
      `
    })

    app.component('son', {
      methods: {
        handleClick () {
          alert(666)
        }
      },
      template: `
      <div>
        <input />
        <span @click="handleClick">
          <slot></slot>
        </span>
      </div>
      `

    })
    
    const vm = app.mount('#root')

  </script>
</body>

</html>      

簡單來梳理這個 slot 的使用流程則是:

  • slot 的能實作父元件在調用子元件時, 直接往裡面寫内容 dom
  • 子元件命名要小寫, 父元件在調的時候以雙标簽的方式往裡面添加 dom
  • 子元件直接用 slot 這個雙标簽進行引用即可, 但其不能綁事件, 但可通過外包一層正常标簽即可

slot 資料作用域

通常在元件通信中, 傳遞的資料是通過 data ( ) 來做驅動的, 這同樣也帶來了一個作用域的問題如下:

<!DOCTYPE html>
<html lang="en">

<head>
  <title>slot 資料作用域</title>
  <script src="https://unpkg.com/vue@3"></script>
</head>

<body>
  <div id="root"></div>
  <script>
    const app = Vue.createApp({
      data () {
        return { text: '送出' }
      },
      template: `
      <son>
        <div>{{text}}</div>
      </son>
      <son>
        <button>{{text}}</button>
      </son>
    
      `
    })

    app.component('son', {
      data () {
        return { text: '點選'}
      },
      methods: {
        handleClick () {
          alert(666)
        }
      },
      template: `
      <div>
        <input />
        <span @click="handleClick">
          <slot>{{text}}</slot>
        </span>
        <div>{{text}}</div>
      </div>
      `

    })
    
    const vm = app.mount('#root')

  </script>
</body>

</html>      

父子元件都用到了 text 這個變量, 但其作用域是不同的, 我們可以看到在父元件這裡, text 用的是父元件的資料.

template: `
      <son>
        <div>{{text}}</div>
      </son>
      <son>
        <button>{{text}}</button>
      </son>
    
      `
    })      

而在子元件這裡, slot 裡面的 text 也是用父元件資料, 但 slot 外面的 text 則用的是子元件自己的資料.

template: `
      <div>
        <input />
        <span @click="handleClick">
          <slot>{{text}}</slot>
        </span>
        <div>{{text}}</div>
      </div>
      `      

小結

最後來對本篇對 slot 的基本概念和使用做一個總結梳理如下:

  • slot 的能實作父元件在調用子元件時, 直接往裡面寫内容 dom
  • 子元件命名要小寫, 父元件在調的時候以雙标簽的方式往裡面添加 dom
  • 子元件直接用 slot 這個雙标簽進行引用即可, 但其不能綁事件, 但可通過外包一層正常标簽即可
  • 父模闆調用的資料屬性, 用的是父模闆資料屬性, 子模闆調用的資料屬性, 用的是子莫不資料屬性