当前位置 : 主页 > 编程语言 > java >

192-vue插槽slots的使用

来源:互联网 收集:自由互联 发布时间:2023-03-22
插槽内容与出口 FancyButton.vue: button class=fancy-btn slot/slot !-- 插槽出口 --/button 父页面使用: FancyButton Click me! !-- 插槽内容 --/FancyButton 最终渲染出的 DOM 是这样: button class=fancy-btnClick me!/

插槽内容与出口

FancyButton.vue:

<button class="fancy-btn"> <slot></slot> <!-- 插槽出口 --> </button>

父页面使用:

<FancyButton> Click me! <!-- 插槽内容 --> </FancyButton>

最终渲染出的 DOM 是这样:

<button class="fancy-btn">Click me!</button>

插槽内容可以是任意合法的模板内容,不局限于文本。 如父页面可以使用:

<FancyButton> <span style="color:red">Click me!</span> <AwesomeIcon name="plus" /> </FancyButton>

渲染作用域

插槽内容无法访问子组件的数据。 父组件模板中的表达式只能访问父组件的作用域;子组件模板中的表达式只能访问子组件的作用域。

默认内容

SubmitButton.vue:

<button type="submit"> <slot> Submit <!-- 默认内容 --> </slot> </button>

父组件:

<SubmitButton />

或者:

<SubmitButton>Save</SubmitButton>

此时 , Save 会取代Submit

具名插槽

BaseLayout.vue:

<div class="container"> <header> <slot name="header"></slot> </header> <main> <slot></slot> </main> <footer> <slot name="footer"></slot> </footer> </div>

父组件:

<BaseLayout> <template v-slot:header> <!-- header 插槽的内容放这里 --> </template> </BaseLayout>

其中<template v-slot:header>可以简写为 <template #header> 完整的使用:

<BaseLayout> <template #header> Here might be a page title </template> <template #default> <p>A paragraph for the main content.</p> <p>And another one.</p> </template> <template #footer> <p>Here's some contact info</p> </template> </BaseLayout>

作用域插槽

子组件MyComponent.vue:

<div> <slot :text="greetingMessage" :count="1"></slot> </div>

父组件使用:

<MyComponent v-slot="slotProps"> {{ slotProps.text }} {{ slotProps.count }} </MyComponent>

也可以在 v-slot 中使用解构:

<MyComponent v-slot="{ text, count }"> {{ text }} {{ count }} </MyComponent>

具名作用域插槽

父组件使用:

<MyComponent> <template #header="headerProps"> {{ headerProps }} </template> <template #default="defaultProps"> {{ defaultProps }} </template> <template #footer="footerProps"> {{ footerProps }} </template> </MyComponent>

高级列表组件示例

子组件:FancyList.vue

<ul> <li v-for="item in items"> <slot name="item" v-bind="item"></slot> </li> </ul>

父组件使用:

<FancyList :api-url="url" :per-page="10"> <template #item="{ body, username, likes }"> <div class="item"> <p>{{ body }}</p> <p>by {{ username }} | {{ likes }} likes</p> </div> </template> </FancyList>
上一篇:FastDFS分布式文件系统入门
下一篇:没有了
网友评论