废弃了的语法

v-slot 指令自 Vue 2.6.0 起被引入,提供更好的支持 slotslot-scope 特性的 API 替代方案。v-slot 完整的由来参见这份 RFC。在接下来所有的 2.x 版本中 slotslot-scope 特性仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。

带有 slot 特性的具名插槽

自 2.6.0 起被废弃。新推荐的语法请查阅这里

<template> 上使用特殊的 slot 特性,可以将内容从父级传给具名插槽 (把这里提到过的 <base-layout> 组件作为示例):

  1. <base-layout>
  2. <template slot="header">
  3. <h1>Here might be a page title</h1>
  4. </template>
  5. <p>A paragraph for the main content.</p>
  6. <p>And another one.</p>
  7. <template slot="footer">
  8. <p>Here's some contact info</p>
  9. </template>
  10. </base-layout>

或者直接把 slot 特性用在一个普通元素上:

  1. <base-layout>
  2. <h1 slot="header">Here might be a page title</h1>
  3. <p>A paragraph for the main content.</p>
  4. <p>And another one.</p>
  5. <p slot="footer">Here's some contact info</p>
  6. </base-layout>

这里其实还有一个未命名插槽,也就是默认插槽,捕获所有未被匹配的内容。上述两个示例的 HTML 渲染结果均为:

  1. <div class="container">
  2. <header>
  3. <h1>Here might be a page title</h1>
  4. </header>
  5. <main>
  6. <p>A paragraph for the main content.</p>
  7. <p>And another one.</p>
  8. </main>
  9. <footer>
  10. <p>Here's some contact info</p>
  11. </footer>
  12. </div>

带有 slot-scope 特性的作用域插槽

自 2.6.0 起被废弃。新推荐的语法请查阅这里

<template> 上使用特殊的 slot-scope 特性,可以接收传递给插槽的 prop (把这里提到过的 <slot-example> 组件作为示例):

  1. <slot-example>
  2. <template slot="default" slot-scope="slotProps">
  3. {{ slotProps.msg }}
  4. </template>
  5. </slot-example>

这里的 slot-scope 声明了被接收的 prop 对象会作为 slotProps 变量存在于 <template> 作用域中。你可以像命名 JavaScript 函数参数一样随意命名 slotProps

这里的 slot="default" 可以被忽略为隐性写法:

  1. <slot-example>
  2. <template slot-scope="slotProps">
  3. {{ slotProps.msg }}
  4. </template>
  5. </slot-example>

slot-scope 特性也可以直接用于非 <template> 元素 (包括组件):

  1. <slot-example>
  2. <span slot-scope="slotProps">
  3. {{ slotProps.msg }}
  4. </span>
  5. </slot-example>

slot-scope 的值可以接收任何有效的可以出现在函数定义的参数位置上的 JavaScript 表达式。这意味着在支持的环境下 (单文件组件现代浏览器),你也可以在表达式中使用 ES2015 解构,如下:

  1. <slot-example>
  2. <span slot-scope="{ msg }">
  3. {{ msg }}
  4. </span>
  5. </slot-example>

使用这里描述过的 <todo-list> 作为示例,与它等价的使用 slot-scope 的代码是:

  1. <todo-list v-bind:todos="todos">
  2. <template slot="todo" slot-scope="{ todo }">
  3. <span v-if="todo.isComplete"></span>
  4. {{ todo.text }}
  5. </template>
  6. </todo-list>