Vue组件之插槽

不具名插槽
<body>
    <div id="app">
        <test-slot></test-slot>
        <test-slot>Server Error</test-slot>
    </div>
    <script>
        Vue.component('test-slot',{
            template:`
                <div>
                    <strong>Error:</strong>
                    <slot>Default Info</slot>
                </div>
            `
        })
        var vm = new Vue({
            el:'#app',
            data:{

            },
            methods:{
                
            }
        })
    </script>
</body>

效果:
在这里插入图片描述

具名插槽

在这里插入图片描述

具名插槽的一般用法
<body>
    <div id="app">
        <base-layout>
            <p slot="header">This is header</p>
            <div>
                {{ msg }}
            </div>
            <p slot="footer">This is footer</p>
        </base-layout>
    </div>
    <script>
        Vue.component('base-layout',{
            template:
            `
                <div>
                    <header>
                        <slot name="header"></slot>
                    </header>
                    <main>
                        <slot></slot>
                    </main>
                    <footer>
                        <slot name="footer"></slot>
                    </footer>    
                </div>
            `
        })
        var vm = new Vue({
            el:'#app',
            data:{
                msg:'this is main content'
            },
            methods:{
                
            }
        })
    </script>
</body>

在这里插入图片描述

具名插槽的另一种用法template包裹多个内容
<body>
    <div id="app">
        <base-layout>
            <template slot="header">
                <p>header p1</p>
                <p>header p2</p>
                <button>Header Button</button>
            </template>
            <template>
                <p>content1</p>
                <textarea name="" id="" cols="30" rows="10"></textarea>
                <p>content2</p>
            </template>
            <template slot="footer">
                <a href="">footer a</a>
                <p>footer</p>
                <button>Footer Button</button>
            </template>
        </base-layout>
    </div>
    <script>
        Vue.component('base-layout',{
            template:
            `
                <div>
                    <header>
                        <slot name="header"></slot>
                    </header>
                    <main>
                        <slot></slot>
                    </main>
                    <footer>
                        <slot name="footer"></slot>
                    </footer>    
                </div>
            `
        })
        var vm = new Vue({
            el:'#app',
            data:{
                msg:'this is main content'
            },
            methods:{
                
            }
        })
    </script>
</body>

在这里插入图片描述
效果:
在这里插入图片描述

作用域插槽(了解一下,因为deprecated)

使用场景:父组件对子组件的内容进行加工处理
在这里插入图片描述
我们先看一个例子:

<body>
    <div id="app">
        <test-list :data="list">

        </test-list>
    </div>
    <script>
        Vue.component('test-list',{
            props:['data'],
            template:`
                    <div>
                        <ul>
                            <li :key="index" v-for="(item,index) in data">  
                                    {{ item.id + '--' + item.name }}
                            </li>
                        </ul>
                    </div>
            `
        })
        var vm = new Vue({
            el: '#app',
            data: {
                list: [{
                    id: 1,
                    name: 'Vue'
                }, {
                    id: 2,
                    name: 'React'
                }, {
                    id: 3,
                    name: 'Angular'
                }]
            },
            methods: {

            }
        })
    </script>
</body>

效果:
在这里插入图片描述
我们现在使用作用域插槽改动一下上面的代码:

<style type="text/css">
    .current{
        color: orangered;
    }
    </style>
<body>
    <div id="app">
        <test-list :data="list">
            <template slot-scope="slotProps">
                <strong v-if="slotProps.info.id=='2'" class="current">{{ slotProps.info.name }}</strong>
                <span v-else>{{ slotProps.info.name }}</span>
            </template>
        </test-list>
    </div>
    <script>
        Vue.component('test-list',{
            props:['data'],
            template:`
                    <div>
                        <ul>
                            <li :key="index" v-for="(item,index) in data">  
                                <slot :info="item"></slot>
                            </li>
                        </ul>
                    </div>
            `
        })
        var vm = new Vue({
            el: '#app',
            data: {
                list: [{
                    id: 1,
                    name: 'Vue'
                }, {
                    id: 2,
                    name: 'React'
                }, {
                    id: 3,
                    name: 'Angular'
                }]
            },
            methods: {

            }
        })
    </script>
</body>

在这里插入图片描述
效果:
在这里插入图片描述
这样就在父组件中操作了子组件传递过来的数据(进行了判断)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值