vue-slot

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .current{
            color:red;
        }
    </style>
    <script src="https://cdn.bootcss.com/vue/2.6.6/vue.min.js"></script>
</head>
<body>
    <div id="app">
        <!-- <test-a>这个是什么</test-a> -->
        <!-- 定义多个slot ---具名插槽 -->
        <test-b>
            <p slot='footer'>这是底部</p>
            <p>这是内容1</p>
            <p>这是内容2</p>
            <p slot='header'>这是顶部</p>
        </test-b>

        <!-- slot 只能在一个标签上写,
            如果要多个标签,可以用<template></template>包裹,这个标签不会再模板里呗渲染 -->
        <test-b>
            <template slot='footer'>
                    <p >这是底部1</p>
                    <p >这是底部2</p>
            </template>
            <!-- <p slot='footer'>这是底部</p> -->
            <p>这是内容1</p>
            <p>这是内容2</p>
            <p slot='header'>这是顶部</p>
        </test-b>

        <!--作用域插槽 -->
        <test-c :list='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-c>

        <!-- v3.x v-solt -->
    </div>

</body>
<script>
//  Vue.component('test-a',{
//      template:`
//         <div>
//             <h3>Warning:</h3>
//             <slot>这个是slot</slot>
//         </div>
//      `
//  })   
//  var app = new Vue({
//      el:'#app',
//      data:{}
//  })


//具名插槽

Vue.component('test-b',{
     template:`
        <div>
                <header>
                    <slot name='header'></slot>
                </header>
                <main>
                    <slot></slot>
                </main>
                <footer>
                    <slot name='footer'></slot>
                </footer>
        </div>
     `
 })  

// var app = new Vue({
//      el:'#app',
//      data:{}
//  })

// 作用域插槽

Vue.component('test-c',{
    props:['list'],
    template:`
        <div>
            <ul>
                 <li :key='item.id' v-for='item in list'>
                    <slot :info='item'>{{item.name}}</slot>
                 </li>
            </ul>
        </div>
     `
 })  

var app = new Vue({
     el:'#app',
     data:{
         list:[
             {
                 id:1,
                 name:'app'
             },
             {
                 id:2,
                 name:'orange'
             },
             {
                 id:3,
                 name:'banana'
             }
         ]
     }
 })


</script>
</html>
原文地址:https://www.cnblogs.com/x-yy/p/13099817.html