插槽是什么?我来告诉你!

插槽的编译

对于插槽的编译,我们只需要记住一句话:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

注意:由于在Vue2.6+版本中,对于插槽相关的内容有所改动:它废弃了旧的用法,新增了v-slot指令。虽然依旧会在Vue2.0版本进行兼容,但在Vue3.0版本会将其进行移除,因此我们在分析插槽实现原理这一章节会以最新的v-slot新语法进行分析。

我们使用如下案例来分析插槽的编译原理:

// 子组件
Vue.component('child-component', {
     
  template: `
  
`
, }) // 父组件 new Vue({ el: '#app', template: ` ` })
父组件的插槽编译

当编译第一个template标签调用processElement方法的时候,会在这个方法里面调用processSlotContent来处理与插槽相关的内容:

export function processElement (
  element: ASTElement,
  options: CompilerOptions
) {
     
  // ...省略代码
  processSlotOutlet(element)
  // ...省略代码
  return element
}

就我们的例子而言,在processSlotContent方法中,其相关代码如下:

const slotRE = /^v-slot(:|$)|^#/
export const emptySlotScopeToken = `_empty_`
function processSlotContent (el) {
     
  let slotScope
  // ...省略代码
  if (el.tag === 'template') {
     
    // v-slot on