默认插槽 <slot>

main.js

//引入Vue

import Vue from 'vue'

//引入App

import App from './App.vue'

//引入插件

import vueResource from 'vue-resource'

//关闭Vue的生产提示

Vue.config.productionTip = false

//使用插件

Vue.use(vueResource)

//创建vm

new Vue({

    el:'#app',

    render: h => h(App),

    beforeCreate() {

        Vue.prototype.$bus = this

    }

})

App.vue

<template>

    <div class="container">

        <Category title="美食" >

            <img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="">

        </Category>

        <Category title="游戏" >

            <ul>

                <li v-for="(g,index) in games" :key="index">{{g}}</li>

            </ul>

        </Category>

        <Category title="电影">

            <video controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>

        </Category>

    </div>

</template>

<script>

    import Category from './components/Category'

    export default {

        name:'App',

        components:{Category},

        data() {

            return {

                foods:['火锅','烧烤','小龙虾','牛排'],

                games:['红色警戒','穿越火线','劲舞团','超级玛丽'],

                films:['《教父》','《拆弹专家》','《你好,李焕英》','《尚硅谷》']

            }

        },

    }

</script>

<style scoped>

    .container{

        display: flex;

        justify-content: space-around;

    }

</style>

Category.vue

<template>

    <div class="category">

        <h3>{{title}}分类</h3>

        <!-- 定义一个插槽(挖个坑,等着组件的使用者进行填充) -->

        <slot>我是一些默认值,当使用者没有传递具体结构时,我会出现</slot>

    </div>

</template>

<script>

    export default {

        name:'Category',

        props:['title']

    }

</script>

<style scoped>

    .category{

        background-color: skyblue;

        width: 200px;

        height: 300px;

    }

    h3{

        text-align: center;

        background-color: orange;

    }

    video{

        width: 100%;

    }

    img{

        width: 100%;

    }

</style>

一、定义使用插槽 Vue 为组件的封装者提供了插槽slot),插槽是指开发者在封装组件时不确定的、希望由组件的使用者指定的部分。也就是说,插槽是组件封装期间为组件的使用者预留的占位符,允许组件的使用者在组件内展示特定的内容。通过插槽,可以使组件更灵活、更具有可复用性。 在封装组件时,在<FancyButton>组件可以通过<slot>标签定义插槽,从而在组件中预留占位符。 <template> <button> <slot></slot> <!-- 插槽出口 --> </button> </template> 在父组件中,则定义插槽内容。 <FancyButton> Click me! <!-- 插槽内容 --> </FancyButton> <slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。 因为插槽内容是在父组件模板中定义的,所以在插槽内容中可以访问到父组件的数据。插槽内容可以是任意合法的模板内容,不局限于文本。 二、具名插槽Vue中当需要定义多个插槽时,可以通过具名插槽来区分不同的插槽。具名插槽是给每一个插槽定义一个名称,这样就可以在对应名称的插槽中提供对应的数据了。 插槽通过<slot>标签来定义,<slot>标签有一个name属性,用于给各个插槽分配唯一的名称,以确定每一处要渲染的内容。添加name属性的<slot>标签可用来定义具名插槽。 定义具名插槽的语法格式如下。 <slot name="插槽名称"></slot> 在父组件中,如果要把内容填充到指定名称的插槽中,可以通过一个包含v-slot 指令的<template>标签来实现,语法格式如下。 <组件名> <template v-slot插槽名称></template> </组件名> v-slot 有对应的简写 #,因此 <template v-slot:插槽名称> 可以简写为 <template #插槽名称>。其意思就是“将这部分模板片段传入子组件的对应插槽中”。 三、作用域插槽 在父组件中不能使用子组件中定义的数据。如果想要在父组件中使用子组件中定义的数据,则需要通过作用域插槽来实现。作用域插槽是带有数据的插槽,子组件提供一部分数据给插槽,父组件接收子组件的数据进行页面渲染。 (1)定义数据 在封装组件的过程中,可以为预留的插槽定义数据,供父组件接收并使用子组件中的数据。在作用域插槽中,可以将数据以类似传递props 属性的形式添加到<slot>标签上。 例如,在封装MyHeader组件时,在插槽中定义数据供父组件使用,示例代码如下。 <slot message="Hello Vue.js"></slot> 在上述代码中,在定义插槽时定义了message属性,表示可以从子组件传递到父组件的信息。 (2)接收数据 使用默认插槽和具名插槽接收数据的方式不同,接下来分别进行讲解。 ①默认插槽Vue中,每个插槽都有name属性,表示插槽的名称。在定义插槽时虽然省略了<slot>标签的name属性,但是name属性默认为default,这样的插槽属于默认插槽。 在父组件中可以通过v-slot 指令接收插槽中定义的数据,即接收作用域插槽对外提供的数据。通过v-slot指令接收到的数据可以在插槽内通过Mustache语法进行访问。 ②具名插槽Vue中,通过<slot>标签添加name属性来定义具名插槽,在具名插槽中也可以向父组件中传递数据。 具名插槽和作用域插槽可以作用在同一个<slot>标签上且并不冲突。<slot>标签的name 属性不会作为数据传递给插槽,所以最终传递给组件的数据只有message属性。 在使用具名插槽时,插槽属性可以作为v-slot的值被访问到,基本语法格式为“v-slot插槽名称="形参"”,简写形式为“#插槽名称="形参"”。 任务案例 插槽综合案例 任务描述: 封装一个名为 <Card> 的组件,它有三个插槽: ① 默认插槽(用于显示主内容) ② 具名插槽 header 和 footer(用于头部和底部区域) ③ 作用域插槽,用于向父组件传递子组件的数据(例如卡片状态)
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值