vue 插槽 slot

一、匿名插槽(单插槽)

  1. 在父组件中
<Children>
    <div>hello world</div>
    <div>hello world</div>
</Children>
  1. 在子组件中,使用 slot 标签定义插槽位置
    slot 标签内的值是插槽无内容时的默认值,当插槽有内容时会被替换掉
<slot>no data</slot>

二、具名插槽(多插槽)

  1. 在父组件中,通过 v-slot 指令指定插槽名称
    default 为默认插槽,在子组件中可以通过 name 指定插槽位置,也可以去掉 name 属性
<Children>
    <template v-slot:title>
        <h2>具名插槽</h2>
    </template>
    <template v-slot:default>
        <h2>默认的具名插槽</h2>
    </template>
</Children>
  1. 在子组件中,设置插槽的显示出口
<slot name="title">no data</slot>

<!-- 默认插槽的两种写法 -->
<slot name="default">no data defalut</slot>
<slot>no data defalut</slot>

三、作用域插槽

在父组件的作用域插槽中可以使用插槽出口所在的子组件中的 data 和 methods

  1. 在父组件的作用域插槽中,接收来自子组件暴露的参数,可以说 data,也可以是 methods
<template>
    <div>
        <h1>App</h1>
        <Children>
            <!-- 具名插槽 -->
            <template v-slot:title>
                <h2>{{ titleValue }}</h2>
            </template>

            <!-- 作用域插槽 -->
            <template v-slot:titleScope="{ titleScopeValue, changeTitleScopeValue }">
                <h2>{{ titleScopeValue }}</h2>
                <h2 @click="changeTitleScopeValue">{{ titleScopeValue }}</h2>
            </template>
        </Children>
    </div>
</template>

<script>
import Children from '@/components/Children.vue';
export default {
    components: {
        Children,
    },
    data() {
        return {
            titleValue: '具名插槽',
        };
    },
};
</script>
  1. 在子组件中通过 <slot> 给父组件传递暴露的 data 和 methods
<template>
    <div>
        <hr />
        <h1>Children</h1>
        <slot name="title">no data</slot>
        <slot name="titleScope" :titleScopeValue="titleScopeValue" :changeTitleScopeValue="changeTitleScopeValue">no scope data</slot>
    </div>
</template>

<script>
export default {
    data() {
        return {
            titleScopeValue: '作用域插槽 data',
        };
    },
    methods: {
        changeTitleScopeValue() {
            this.titleScopeValue = '作用域插槽 methods';
        },
    },
};
</script>

<style lang="scss" scoped></style>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容