vue - 插槽slot

描述:插槽,也就是slot,是组件的一块HTML模板,一个slot最核心的两个问题是显示不显示和怎样显示

插槽分类:

1.1 单个插槽(单个插槽,别名默认插槽、匿名插槽,不用设置name属性)

1.2 具名slot(插槽加了name属性,就变成了具名插槽。具名插槽可以在一个组件中出现N次,出现在不同的位置)

1.3 作用域slot(vue2.5版本中slot-scope取代了scope,来实现作用域插槽,主要用在组件调用中,具体在template标签上面使用slot-scope来获取插槽slot上面的属性值,获取值的为一个对象,slot-scope=”它可以取任意字符串”,在element-ui的组件中经常看到)

 

 

<!-- 单个插槽-->
<!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>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <children1>
            <span>12345</span>
        </children1>
    </div>

    <script type="text/javascript">
        var app = new Vue({
            el: '#app',
            components: {
                children1: {
                    template: "<button><slot></slot>单个插槽</button>"
                }
            }
        });
    </script>
</body>

</html>

 

 

 1 <!-- 具名插槽 -->
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 
 5 <head>
 6     <meta charset="UTF-8">
 7     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 8     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 9     <title>Document</title>
10     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
11 </head>
12 
13 <body>
14     <div id="app">
15         <children2>
16             <span slot="first" @click="tobeknow">12345</span>
17             <span slot="second">56789</span>
18         </children2>
19     </div>
20 
21     <script type="text/javascript">
22         var app = new Vue({
23             el: '#app',
24             methods: {
25                 tobeknow: function () {
26                     console.log("It is the parent's method");
27                 }
28             },
29             components: {
30                 children2: {//这个无返回值,不会继续派发  
31                     template: "<button><slot name='first'></slot>具名插槽,<slot name='second'></slot></button>"
32                 }
33             }
34         });
35     </script>
36 </body>
37 
38 </html>

 

 1 <!-- 作用域插槽 -->
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 
 5 <head>
 6     <meta charset="UTF-8">
 7     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 8     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 9     <title>Document</title>
10     <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
11 </head>
12 
13 <body>
14     <div id="app">
15         <!-- 将数据传递给组件 -->
16         <tb-list :data="data">
17             <!-- 获取slot上面的值 -->
18             <template slot-scope="scope">
19                 <p>索引:{{JSON.stringify(scope)}}</p>
20                 <p>索引:{{scope.$index}}</p>
21                 <p>姓名:{{scope.row.name}}</p>
22                 <p>年龄: {{scope.row.age}}</p>
23                 <p>性别: {{scope.row.sex}}</p>
24             </template>
25         </tb-list>
26     </div>
27 
28     <script type="text/javascript">
29         var app = new Vue({
30             el: '#app',
31             data: {
32                 data: [{
33                     name: 'kongzhi1',
34                     age: '29',
35                     sex: 'man'
36                 }]
37             },
38             components: {
39                 // 作用域slot
40                 'tb-list': {
41                     template:
42                         `<ul>
43                             <li v-for="(item, index) in data">
44                                 <slot :row="item" :$index="index"></slot>
45                             </li>
46                         </ul>`,
47                     // 获取值
48                     props: ['data']
49                 }
50             }
51         });
52     </script>
53 </body>
54 
55 </html>

 

posted @ 2018-09-10 11:51  Sunsin  阅读(326)  评论(0编辑  收藏  举报