基础概念
插槽一般是在子组件中设置一个坑,这个坑就是插槽,在父组件中设置内容,将此内容插入到插槽中。
插槽有三种:
- 单个插槽
- 具名插槽
- 作用域插槽
单个插槽
就是子组件中设置了一个单一的插槽。
<template> <div> <slot></slot> </div> </template>
<template> <div> <Child> <span>我是一个单一插槽</span> </Child> </div> </template>
|
具名插槽
上面是比较单一的,每个插槽的内容都是一样的,如果我们想要给不同的插槽都设置不同的内容,那么,我们就可以给插槽定义一个名字:name=”xxx”,然后在父组件中使用 template 包裹内容,并添加 v-slot:xxx 属性来将内容指定给相应的插槽。
<template> <div> <header> <slot name="header"></slot> </header> <main> <slot></slot> </main> <footer> <slot name="footer"></slot> </footer> </div> </template>
<template> <div> <Child> <template v-slot:header> <span>我是头部</span> </template> <template> <span>我是主体</span> </template> <template v-slot:footer> <span>我是尾部</span> </template> </Child> </div> </template>
|
现在 元素中的所有内容都将会被传入相应的插槽。任何没有被包裹在带有 v-slot 的 中的内容都会被视为默认插槽的内容。
然而,如果你希望更明确一些,仍然可以在一个 中包裹默认插槽的内容。
上面的 v-slot 属性是 2.6.0+ 的属性,之前的属性被废除了,但是还可以使用。
可能你在一些以vue2搭建的项目时,还是会看到就属性,所以在这里简单介绍一下.
我们可以使用 slot=”xxx” 将 template 中的 v-slot 属性。
<template> <div> <Child> <template slot="header"> <span>我是头部</span> </template> <template> <span>我是主体</span> </template> <template slot="footer"> <span>我是尾部</span> </template> </Child> </div> </template>
|
作用域插槽
前两种的插槽都是不能访问到子组件的数据的,那么有时候我们需要传递一个数据,比如一个链接时,那该怎么办呢,用vuex吗?这就太浪费性能了。
所以说,作用域插槽就出来了,方便我们使用子组件的数据。
<template> <div> <slot :url="url">我是头部</slot> </div> </template>
<script> export default { data() { return { url: "https://www.baidu.com", }; }, }; </script>
<template> <div> <Child> <template v-slot="url"> <a :href="url.url">这是百度,路径为{{ url.url }}</a> </template> </Child> </div> </template>
|
我们也可以使用 ES6 的解构赋值
<Child> <template v-slot="{url}"> <a :href="url">这是百度,路径为{{ url }}</a> </template> </Child>
|
个人简介:脆弱的种子在温室也会死亡,坚强的种子,在沙漠也能发芽。