1.slot:名为插槽,实则作为分发数据的一种接口形式。
2.slot主要有具名插槽和作用域插槽。
①具名插槽主要针对多个插槽,为了区分这些插槽作用于不同的地方,因此在定义插槽的时候,添加name属性用来表示插槽名。
②作用域插槽主要用于针对不同的插槽、不同的条件下插入不同的数据,以达到理想效果。
话不多说,先上代码,再做分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <div id="app8"> <current-user v-bind:user="user"> <template #default="myslot"> </template> <template #myslot="myslot"> 父组件: <span v-if="myslot.user.isFirstName">{{ myslot.user.firstName }}</span> <span v-else>{{ myslot.user.lastName }}</span> </template> </current-user> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| Vue.component('current-user', { props:['user'], template:` <span> <slot v-bind:user="user"> 子组件:{{ user.lastName }} </slot> <slot name="myslot" v-bind:user="user"> 子组件:{{ user.firstName }} </slot> </span> ` }); var app8 = new Vue({ el:'#app8', data:function(){ return { user:{ lastName:'云中', firstName:'司', isFirstName:true } } } })
|
说明:
1.current-user是我自定义的一个组件,绑定了user的property,用于获取vue实例(app8)中的user对象。
2.组件中的template
中使用了<slot></slot>
标签,用于定义插槽。包含了name
属性,用于标识插槽的名称,还包含了v-bind
,用于绑定父级插槽,也就是<template></template>
标签,然后指明我所使用的插槽名,可以用v-slot
指定,也可以缩写为#
,但是使用缩写必须要跟上参数(也就是插槽名),例如v-slot:default = "myslot"
等价于#:default="myslot"
。
3. <template #default="myslot"></template>
相当于<slot name="myslot" v-bind:user="user"></slot>
的父插槽。
4.插槽中通常可以结合v-if
来显示不同的插槽内容。
注:这里需要绑定父级插槽,如果不绑定父级插槽,而使用如下的代码,则会插槽将不会显示任何内容
错误代码:
1 2 3
| <current-user> {{ user.firstName }} </current-user>
|
1 2 3 4 5 6 7 8 9 10 11
| template:` <span> <slot> 子组件:{{ user.lastName }} </slot> <slot> 子组件:{{ user.firstName }} </slot> </span> `
|