vue slot

作者: 刘越姐姐啊 | 来源:发表于2019-07-15 10:33 被阅读0次

    由于之前开发的大数据项目(vue)中有使用到slot,当时是为了完成项目进度,在网上找的做好的组件直接使用的,并不懂slot的用法,最近趁着没有项目发开任务,重新学了一下vue slot的相关内容,目前学的比较浅,希望之后能后作出一些小demo。

    项目实例

    项目层级关系:入口为home.vue,并且为父组件,子组件为Testslot.vue,其中子组件用来完成模板,父组件用来调用子组件并显示。

    //子组件Testslot.vue
    <template>
        <div class="panel">
            <div class="title">这是头部</div>
            <div class="content">这是中间的内容</div>
            <div class="footer">这是尾部</div>
        </div>
    </template>
    
    <style scoped>
    .panel{
        max-width: 300px;
        border: 1px solid #999;
        padding: 15px;
    }
    .panel .title{
        border-bottom: 1px solid #999;
    }
    .panel .footer{
        border-top: 1px solid #999;
    }
    </style>
    
    //父组件home.vue
    <template>
        <div>
            <panel></panel>
            <panel></panel>
            <panel></panel>
        </div>
    </template>
    
    <script>
    import Testslot from './Testslot.vue';
    export default {
        components: {
            'panel':Testslot
        },
    }
    </script>
    
    此时代码的效果如图 image.png

    此时的效果是有三个自己定义的panel,三个里面的内容全都一样,现在想要让模板里面的content的内容可以自己定义,其他的地方不变,这就需要使用到slot,代码如下。

    //子组件Testslot.vue
    <template>
        <div class="panel">
            <div class="title">这是头部</div>
            <div class="content">
                <slot></slot>
            </div>
            <div class="footer">这是尾部</div>
        </div>
    </template>
    
    <style scoped>
    .panel{
        max-width: 300px;
        border: 1px solid #999;
        padding: 15px;
    }
    .panel .title{
        border-bottom: 1px solid #999;
    }
    .panel .footer{
        border-top: 1px solid #999;
    }
    </style>
    
    //父组件home.vue
    <template>
        <div>
            <panel>123</panel>
            <panel>456</panel>
            <panel>789</panel>
        </div>
    </template>
    
    <script>
    import Testslot from './Testslot.vue';
    export default {
        components: {
            'panel':Testslot
        },
    }
    </script>
    

    此时的效果如下图


    image.png

    这就通过匿名插槽实现了自定义模板的内容,而什么是具名插槽呢,就是我现在不止想要content的内容也已自定义,我想把title和footer都通过slot变成自定义的,但是我在父组件中调用panel的时候,怎么那个panel知道哪些文字是放在title的,哪些文字是放在content的,哪些文字是放在footer的呢??!!代码如下:

    //子组件Testslot.vue
    <template>
        <div class="panel">
            <div class="title">
                <slot name="title"></slot>
            </div>
            <div class="content">
                <slot name="content"></slot>
            </div>
            <div class="footer">
                <slot name="footer"></slot>
            </div>
        </div>
    </template>
    
    <style scoped>
    .panel{
        max-width: 300px;
        border: 1px solid #999;
        padding: 15px;
    }
    .panel .title{
        border-bottom: 1px solid #999;
    }
    .panel .footer{
        border-top: 1px solid #999;
    }
    </style>
    
    //父组件home.vue
    <template>
        <div>
            <panel>
                <div slot="title">title1</div>
                <div slot="content">content1</div>
                <div slot="footer">footer1</div>
            </panel>
            <panel>
                <div slot="title">title2</div>
                <div slot="content">content2</div>
                <div slot="footer">footer2</div>
            </panel>
        </div>
    </template>
    
    <script>
    import Testslot from './Testslot.vue';
    export default {
        components: {
            'panel':Testslot
        },
    }
    </script>
    

    效果如下


    image.png

    好啦!!以上就是我对匿名插槽和具名插槽的理解,希望对你也有帮助哟~

    相关文章

      网友评论

          本文标题:vue slot

          本文链接:https://www.haomeiwen.com/subject/xijgkctx.html