slot content
v-slot是一种组件内容复用的方式。可以向父级组件中传入特定的内容,使得其渲染到特定的位置。
<!-- 子级组件 --><a :href="url"><strong>Error, </strong><slot>AHA</slot></a><!-- 父级组件 --><navigation-link><template v-slot:default>hello v-slot</template></navigation-link>
compilation scope
父级组件和子组件中变量的作用域,在默认情况下都是仅限于当前组件。
fallback content
可以在子组件中设置一个 fallback 内容,当父级组件没有设置内容时作为默认内容来进行展示。
<button type="submit"><slot>Submit</slot></button>
named slots
我们可以在子组件中设置多个 slot 并为其设置特定的名字,这样在父级组件传值的时候就可以将其传递到特定的位置,更为精细的控制传值方式。
<div class="container"><header><slot name="header"></slot></header><main><slot></slot></main><footer><slot name="footer"></slot></footer></div><!-- 使用方式 --><base-layout><template v-slot:header><h1>Here might be a page title</h1></template><p>A paragraph for the main content.</p><p>And another one.</p><template v-slot:footer><p>Here's some contact info</p></template></base-layout>
scoped slots
通过设置
scoped slots可以将子组件中的数据传递给父级组件,可以在父级组件中来决定传递给子组件的值是多少。
<!-- 子级组件 --><div><slot :user="user">{{ user.lastName }}</slot></div><current-user><template v-slot:default="{ user }">{{ user.lastName }}</template></current-user>
在子组件中设定好 user 的值,并作为 props 通过 <slot></slot> 传入到父级组件,这样父级组件就可以访问到这个 user 值。
dynamic slot name
动态的设置具名 slot 的值。
<base-layout><template v-slot:[dynamicSlotName]>...</template></base-layout>
使用 [] 来设置具名 slot 的名字。
abbreviated syntax and deprecated syntax
default 缩略
<current-user v-slot:default="slotProps">{{ slotProps.user.firstName }}</current-user><current-user v-slot="slotProps">{{ slotProps.user.firstName }}</current-user>
在使用 scope slots 特性时,可以省去 :default 的书写以及对应的 <template> 标签包裹。
named slots shorhand
<base-layout><template #header><h1>Here might be a page title</h1></template><p>A paragraph for the main content.</p><p>And another one.</p><template #footer><p>Here's some contact info</p></template></base-layout><current-user #default="{ user }">{{ user.firstName }}</current-user>
使用 #name 来代替 v-slot:name 。使用 default 的时候,需要设置为 #slot 。
deprecated syntax
<base-layout><template slot="header"><h1>Here might be a page title</h1></template><p>A paragraph for the main content.</p><p>And another one.</p><template slot="footer"><p>Here's some contact info</p></template></base-layout>
<slot-example><template slot="default" slot-scope="slotProps">{{ slotProps.msg }}</template></slot-example>
现语法和淘汰语法的对比
| 对比项目 | 现语法 | 淘汰的语法 |
|---|---|---|
| 具名slot | v-slot:name | slot=”name” |
| scoped slots | v-slot:default=”slotProps” | slot-scope=”slotProps” |
