Vue 进阶之路(十二)

释放双眼,带上耳机,听听看~!

之前的文章我们介绍了一下 vue 中插槽的使用,本章我们接着介绍一下 vue 中的作用域插槽。

 1 <!DOCTYPE html>
 2 <html lang=\"en\">
 3 <head>
 4     <meta charset=\"UTF-8\">
 5     <title>vue</title>
 6     <script src=\"https://cdn.jsdelivr.net/npm/vue\"></script>
 7 </head>
 8 <body>
 9 <div id=\"app\">
10     <child></child>
11 </div>
12 <script>
13     Vue.component(\"child\", {
14         data() {
15             return {
16                 list: [\"aaa\", \"bbb\", \"ccc\"]
17             }
18         },
19         template: `
20             <div>
21                 <p v-for=\"(item,index) of list\" :key=\"index\">{{item}}</p>
22             </div>
23        `
24     });
25     var app = new Vue({
26         el: \'#app\',
27     })
28 </script>
29 </body>
30 </html>

在上面的代码中我们在子组件 child 中定义了一个 list 的数据,然后通过循环输出的形式把每一项输出在了一个 <p> 标签内,结果如下:

Vue 进阶之路(十二)

上面的代码显然符合我们之前的预期,但是现在有一个问题,我想让 list 数组内的数据不是放在 <p> 标签内,而是放在一个 <h1> 标签内,那这样的话我们就需要将 template 内的 <p> 标签换为 <h1> 标签,但是别的地方却需要使用 <p> 标签输出,这该怎么办,我们总不能写两个不同的子组件吧,官方为我们提供了作用于插槽来解决这个问题,如下:

 1 <!DOCTYPE html>
 2 <html lang=\"en\">
 3 <head>
 4     <meta charset=\"UTF-8\">
 5     <title>vue</title>
 6     <script src=\"https://cdn.jsdelivr.net/npm/vue\"></script>
 7 </head>
 8 <body>
 9 <div id=\"app\">
10     <child>
11         <template slot-scope=\"props\">
12             <h1>{{props.item}}</h1>
13         </template>
14     </child>
15 </div>
16 <script>
17     Vue.component(\"child\", {
18         data() {
19             return {
20                 list: [\"aaa\", \"bbb\", \"ccc\"]
21             }
22         },
23         template: `
24             <div>
25                 <slot v-for=\"(item,index) of list\" :key=\"index\" :item=\"item\">{{item}}</slot>
26             </div>
27        `
28     });
29     var app = new Vue({
30         el: \'#app\',
31     })
32 </script>
33 </body>
34 </html>

我们将 template 内的 <p> 标签变为 <slot> 标签,然后在 <slot> 标签内加上一个 :item=\"item\" 的属性,意思是将 item 内容通过 :item=\"\" 的形式展示出去。

在 <child> 标签内加入一个 <template> 标签,标签内加入 slot-scope=\"props\",意思是通过 slot-scope=\"scope\" 将 template 内的 slot 进行连接。

然后输出 <h1>{{props.item}}</h1> ,意思是将连接的 slot 内的展示出来的 :item 内的值展示出来,并且展示在 <h1> 标签内。

运行结果如下:

Vue 进阶之路(十二)

符合我们的预期,这样我们如果想让输出内容放在 <p> 标签内,只需要将 <h1> 标签改为 <p> 标签即可,不需要再去改动子组件。

 

给TA打赏
共{{data.count}}人
人已打赏
随笔日记

《跃迁-成为高手的技术》之联机学习

2020-11-9 4:44:41

随笔日记

博客园是个大金矿,管理员不挖掘有些可惜:给博客园提一些双赢的建议,『建议』给博客园官方的一个意见,『建议』给博客园官方的一个意见

2020-11-9 4:44:43

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索