vue中插槽的使用记录

本文介绍了Vue中插槽slot的使用,可将DOM元素插入指定位置以实现组件间参数传递。包括默认插槽、具名插槽(通过name属性确保唯一)、作用域插槽(子组件定义数据,父组件可访问)和具名作用域插槽(前两者结合),并给出了相应示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插槽slot中,我们可以将DOM元素插入到指定位置,从而方便我们进行组件之间的参数传递

1.默认插槽

子组件中:

<template>
    <div id="data">
        <div class="demo-datetime-picker">
            <div class="block">
                <span class="demonstration">Default</span>
                <el-date-picker v-model="value1" type="datetime" placeholder="Select date and time" />
            </div>
            <div class="block">
                <span class="demonstration">With shortcuts</span>
                <el-date-picker v-model="value2" type="datetime" placeholder="Select date and time"
                    :shortcuts="shortcuts" />
            </div>
            <div class="block">
                <span class="demonstration">With default time</span>
                <el-date-picker v-model="value3" type="datetime" placeholder="Select date and time"
                    :default-time="defaultTime" />
            </div>
        </div>
        <slot>这是段默认插槽内容</slot>
    </div>
</template>

父组件中:

<template>
    <div class="content">
        <dropdown />
        <datatime>
            <h1>这是父组件中的插槽内容</h1>
        </datatime>
    </div>
</template>

结果:

注册的子组件中没有内容时

注册的子组件中有内容时

2.具名插槽(在插槽中定义一个name属性来确保该插槽的唯一)

子组件中:

<template>
    <div id="data">
        <div class="demo-datetime-picker">
            <div class="block">
                <span class="demonstration">Default</span>
                <el-date-picker v-model="value1" type="datetime" placeholder="Select date and time" />
            </div>
            <div class="block">
                <span class="demonstration">With shortcuts</span>
                <el-date-picker v-model="value2" type="datetime" placeholder="Select date and time"
                    :shortcuts="shortcuts" />
            </div>
            <div class="block">
                <span class="demonstration">With default time</span>
                <el-date-picker v-model="value3" type="datetime" placeholder="Select date and time"
                    :default-time="defaultTime" />
            </div>
        </div>
        <slot name="checkdata">这是段默认插槽内容</slot>
    </div>
</template>

父组件中(使用template模板,中的v-slot属性,后跟子组件中定义的名字):

<template>
    <div class="content">
        <dropdown />
        <!-- 具名插槽 -->
        <datatime>
            <template v-slot:checkdata>
                <h1>这是插槽内的内容</h1>
            </template>
        </datatime>


    </div>
</template>

3.作用域插槽(子组件中定义数据,父组件那边就可以访问)

子组件定义动态数据:

<template>
    <div class="flex flex-wrap items-center">
        <el-dropdown>
            <el-button type="primary">
                Dropdown List<el-icon class="el-icon--right"><arrow-down /></el-icon>
            </el-button>
            <template #dropdown>
                <el-dropdown-menu>
                    <el-dropdown-item>Action 1</el-dropdown-item>
                    <el-dropdown-item>Action 2</el-dropdown-item>
                    <el-dropdown-item>Action 3</el-dropdown-item>
                    <el-dropdown-item>Action 4</el-dropdown-item>
                    <el-dropdown-item>Action 5</el-dropdown-item>
                </el-dropdown-menu>
            </template>
        </el-dropdown>
        <el-dropdown split-button type="primary" @click="handleClick">
            Dropdown List
            <template #dropdown>
                <el-dropdown-menu>
                    <el-dropdown-item>Action 1</el-dropdown-item>
                    <el-dropdown-item>Action 2</el-dropdown-item>
                    <el-dropdown-item>Action 3</el-dropdown-item>
                    <el-dropdown-item>Action 4</el-dropdown-item>
                    <el-dropdown-item>Action 5</el-dropdown-item>
                </el-dropdown-menu>
            </template>
        </el-dropdown>
    <slot :text="content" :count="2"></slot>
    </div>
</template>
  
<script setup>
import { ArrowDown } from '@element-plus/icons-vue'

const handleClick = () => {
    // eslint-disable-next-line no-alert
    alert('button click')
}
const content = '你好,我是子组件传递过来的值'
</script>

父组件可以直接利用v-slot进行数据的接收,接收名称自定义即可:


<template>
    <div class="content">
        <dropdown />
        <!-- 作用域插槽 -->
        <dropdown v-slot="props">
            {{ props.count }},{{ props.text }}
        </dropdown>
    </div>
</template>

<script setup>
import dropdown from '../views/dropdown.vue';
import datatime from '../views/datatime.vue';
</script>

<style scoped>
.content {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
}
</style>

结果:

4.具名作用域插槽(以上两种的结合)

子组件:

<template>
    <div id="data">
        <div class="demo-datetime-picker">
            <div class="block">
                <span class="demonstration">Default</span>
                <el-date-picker v-model="value1" type="datetime" placeholder="Select date and time" />
            </div>
            <div class="block">
                <span class="demonstration">With shortcuts</span>
                <el-date-picker v-model="value2" type="datetime" placeholder="Select date and time"
                    :shortcuts="shortcuts" />
            </div>
            <div class="block">
                <span class="demonstration">With default time</span>
                <el-date-picker v-model="value3" type="datetime" placeholder="Select date and time"
                    :default-time="defaultTime" />
            </div>
        </div>
        <slot name="checkdata" :games="games">这是段默认插槽内容</slot>
    </div>
</template>
  
<script setup>
import { ref } from 'vue'

const value1 = ref('')
const value2 = ref('')
const value3 = ref('')
const defaultTime = new Date(2000, 1, 1, 12, 0, 0)
const games = ['红色警戒', '穿越火线', '超级玛丽']
const shortcuts = [
    {
        text: 'Today',
        value: new Date(),
    },
    {
        text: 'Yesterday',
        value: () => {
            const date = new Date()
            date.setTime(date.getTime() - 3600 * 1000 * 24)
            return date
        },
    },
    {
        text: 'A week ago',
        value: () => {
            const date = new Date()
            date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
            return date
        },
    },
]
</script>
<style scoped>
.demo-datetime-picker {
    display: flex;
    width: 100%;
    padding: 0;
    flex-wrap: wrap;
}

.demo-datetime-picker .block {
    padding: 30px 0;
    text-align: center;
    border-right: solid 1px var(--el-border-color);
    flex: 1;
}

.demo-datetime-picker .block:last-child {
    border-right: none;
}

.demo-datetime-picker .demonstration {
    display: block;
    color: var(--el-text-color-secondary);
    font-size: 14px;
    margin-bottom: 20px;
}
</style>
  

父组件(template模板中用'#'来定义子组件中的名称,后面跟自定义的参数名称):

    <template>
        <div class="content">
            <dropdown />

            <!-- 具名作用域插槽 -->
            <datatime>
                <template #checkdata="headerprops">
                    {{ headerprops }}
                </template>
            </datatime>

        </div>
    </template>

    <script setup>
    import dropdown from '../views/dropdown.vue';
    import datatime from '../views/datatime.vue';
    </script>

    <style scoped>
    .content {
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
    }
    </style>

结果:

以上就是我对slot插槽的一些简单的理解,如果有说的不对的地方还希望各位大佬补充

### Vue2 中具名插槽与作用域插槽使用Vue2 中,具名插槽(named slots)允许组件定义多个插槽并给这些插槽命名;而作用域插槽(scoped slots),则让父级可以访问子组件的数据来渲染内容。 #### 使用具名插槽 为了创建具名插槽,在子组件内通过`<template>`标签指定`v-slot:[name]`属性。下面是一个简单的例子: ```html <!-- 子组件 ChildComponent.vue --> <div> <slot name="header"></slot> <p>这里是默认的内容。</p> <slot name="footer"></slot> </div> ``` 在父组件中可以通过如下方式填充上述具名插槽: ```html <!-- 父组件 ParentComponent.vue --> <ChildComponent> <!-- 填充 header 插槽 --> <template v-slot:header> <h1>这是头部区域</h1> </template> <!-- 填充 footer 插槽 --> <template v-slot:footer> <button>点击这里</button> </template> </ChildComponent> ``` #### 结合使用具名插槽和作用域插槽 当希望传递数据到父组件用于特定位置展示时,则需要用到作用域插槽。这通常涉及到从子组件向上传递一些信息作为插槽的作用域变量。 考虑一个列表项组件的例子,其中每一项都可能有不同的操作按钮显示逻辑由外部决定: ```html <!-- 子组件 ListItem.vue --> <li class="list-item"> <slot :item="item" name="action-buttons"></slot> </li> <script> export default { props: ['item'] } </script> ``` 此时可以在父组件里这样写以利用这个功能: ```html <!-- 父组件 ListContainer.vue --> <ListItem v-for="(item, index) in items" :key="index" :item="item"> <template v-slot:action-buttons="{ item }"> <span v-if="item.isEditable">编辑 | 删除</span> <span v-else>查看详情</span> </template> </ListItem> ``` 在这个案例中,`{ item }`就是解构出来的来自子组件传过来的对象参数,它使得我们可以基于每条记录的具体情况定制化地构建UI[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值