天天看点

vue中的具名插槽和作用域插槽使用

1.具名插槽

如果给 组件内 设置 slot name 组件标签内的内容都会显示出来

如果我们想组件标签内的 内容我们可以 指定位置  指定内容显示

就需要给这些标签 设置不同的插槽,就需要使用 具名插槽

例子如下:

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>具名插槽</title>
</head>
<body>
    <div id="app">
        <name-Card>
            <p>18622553666</p>
            <span slot="name">个人信息</span>
            <h1 slot="tel">15836362555</h1>
            <template slot="address">河南郑州高新区万科城
            </template>
            <p>这个没有slot指令 的 标签内容 我们叫匿名插槽
                没有指定slot属性的内容会被显示在匿名slot中
                如果组件没有匿名slot 这部分内容就被丢弃,不显示
            </p>
        </name-Card>

    </div>
    <script src="../zuoye/作业-星级评分/vue.js"></script>
    <script type="text/html" id="name-card">
        <div>
            <!-- 匿名插槽 没有name属性 -->
            <slot></slot>
            <h3>姓名:<slot name="name"></slot></h3>
            <p>电话:<slot name="tel"></slot></p>
            <p>家庭住址:<slot name="address"></slot></p>
        </div>

    </script>
    <script>
        var nameCard = {
            template:"#name-card"
        }
        new Vue({
            el:"#app",
            components:{
                nameCard
            }
        })
    </script>
</body>
</html>
           

注意:如果你想显示内容 不需要标签

        组件渲染的时候 会根据这个slot的属性值

        去组件内找 name 为 address 的 slot标签

         然后 这个slot 标签 替换成标签内容

2.作用域插槽

官网代码演示:

vue中的具名插槽和作用域插槽使用

 小实例: 感觉像 父子 组件传值一样

              绑定的属性 都会在 插槽slot-scope属性对应的值 

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>scope</title>
</head>
<body>
    <div id="app">
        <!-- 作用域插槽 scope -->
       <com1>
           <template slot="s1" slot-scope="scope1">
               <p>{{scope1.subData}}</p>
               <hr>
              {{scope1.subData}}--{{scope1.abc}}
           </template>
       </com1>
    </div>
    <script src="../zuoye/作业-星级评分/vue.js"></script>
    <script type="text/html" id="component1">
        <div>
            <h1>子组件</h1>
            <p>
                <slot name="s1" :subData="subData" abc="123"> </slot>
            </p>
        </div>
    </script>
    <script>
        var com1 = {
            template:"#component1",
            data:function(){
                return{
                    subData:"翠花"
                }

            }
        }
        new Vue({
            el:"#app",
            data:{
                appData:"张三"
            },
            components:{
                com1
            }
        })
    </script>
</body>
</html>