vue 插槽的基本使用
vue 提供了三种插槽:匿名插槽,具名插槽,作用域插槽
匿名插槽
子组件定义了 solt,但未提供名字,这就是匿名插槽,也叫做默认插槽,只要出现的父组件中,未指定插槽名字的内容,都会默认放到匿名插槽里。
子组件
1 2 3
| <template> <div><slot></slot>//匿名插槽</div> </template>
|
父组件
1 2 3 4 5
| <template> <div> <myComponent>我被放进了插槽中</myComponent> </div> </template>
|
默认值
当父组件没有提供内容的时候,会默认渲染插槽内的内容,传值则会被替换
具名插槽
所谓具名插槽,就是给插槽命了名字,父组件放进来的内容,需要指定插槽的名称,这个时候才会被分发到这个具名插槽中。
子组件
1 2 3 4 5 6 7 8 9 10 11 12
| <template> <div> <div class="slot1"> <slot name="slot1"></slot> <!-- 名为“slot1”的具名插槽 --> </div> <div class="slot2"> <slot></slot> <!-- 匿名插槽 --> </div> </div> </template>
|
父组件
1 2 3 4 5 6 7 8 9 10 11 12
| <template> <div> <myComponent> <template v-slot:slot1> <p>名为slot1的具名插槽中</p> </template> <!-- 这个会放到solt1中 --> <p>啦啦啦啦德玛西亚</p> <!-- 这个会放到默认插槽中 --> </myComponent> </div> </template>
|
作用域插槽
有时让插槽内容能够访问子组件中才有的数据是很有用的。所以提供了作用域插槽
1 2 3 4 5
| <span> <slot v-bind:user="user"> {{ user.lastName }} </slot> </span>
|
绑定在 <slot>
元素上的 attribute 被称为插槽 prop。现在在父级作用域中,我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字:
1 2 3 4 5
| <current-user> <template v-slot:default="slotProps"> {{ slotProps.user.firstName }} </template> </current-user>
|
总结一点就是可以在父组件访问到子组件的数据,相当于函数传参。
注意
- 注意默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确:
- 只要出现多个插槽,请始终为所有的插槽使用完整的语法
1 2 3 4 5 6
| <todo-list v-bind:todos="todos"> <template v-slot:todo="{ todo }"> <span v-if="todo.isComplete">✓</span> {{ todo.text }} </template> </todo-list>
|