Vue中插槽的使用方法
默认插槽
使用方法:
- 在子组件中使用slot标签进行占位,在父组件中给占位填充内容
子组件
<template>
<div>
<h1>我是标题:</h1>
<slot></slot>
</div>
</template>
<script>
export default {
name: "Son",
data() {
return {};
},
};
</script>
父组件
<template>
<div>
<Son>
<span style="margin: 20px">我是标题内容</span>
</Son>
</div>
</template>
<script>
import Son from "./Son"; //引入子组件
export default {
name: "Father",
components: { //声明子组件
Son,
},
data() {
return {};
},
};
</script>
展示效果
具名插槽
有时我们需要将多个插槽插入到不同的位置,这时候需要用到具名插槽
使用方法
- 给在子组件中的slot添加name属性进行区分,一个不带
name
的<slot>
会带有隐含的名字“default”,即默认插槽。
子组件
<template>
<div>
<h1>我是标题:</h1>
<slot></slot>
<h1>我是标题图片:</h1>
<slot name="img"></slot>
</div>
</template>
<script>
export default {
name: "Son",
data() {
return {};
},
};
</script>
父组件
<template>
<div>
//方法一:父组件通过 slot="name" 的方式指定到对应的插槽中
<Son>
<div style="margin: 20px">我是标题内容</div>
<div slot="img">我是标题的图片</div>//
</Son>
//方法二:在外面包裹一层template标签,通过 v-slot:name 的方式指定到对应的插槽中
<Son>
<div style="margin: 20px">我是标题内容</div>
<template v-slot:img>
<div slot="img">我是标题的图片</div>
</template>
</Son>
</div>
</template>
<script>
import Son from "./Son";
export default {
name: "Father",
components: {
Son,
},
data() {
return {};
},
};
</script>
展示效果
两种方法的区别(摘自官网的说明)
v-slot
指令自 Vue 2.6.0 起被引入,提供更好的支持slot
和slot-scope
attribute 的 API 替代方案。v-slot
完整的由来参见这份 RFC。在接下来所有的 2.x 版本中slot
和slot-scope
attribute 仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。
作用域插槽
当父组件填充的内容需要用到子组件中的数据时,使用作用域插槽
子组件
<template>
<div>
<h1>我是标题图片:</h1>
<slot :images="images"></slot> //将images的值通过slot传递给父组件,这里可以传递多个值
</div>
</template>
<script>
export default {
name: "Son",
data() {
return {
images: ["图片1", "图片2", "图片3"],
};
},
};
</script>
父组件
/*
必须包裹一层template标签
可以自定义接收数据的名称,这里接收到的数据为{ "images": [ "图片1", "图片2", "图片3" ] }
{ images }这里是使用了“解构”
*/
<template>
<div>
//方法一 旧api
<Son>
<template scope="data">//自定义接收数据的名称
<ul>
<li v-for="(img, index) in data.images" :key="index">{{ img }}</li>
</ul>
</template>
</Son>
//方法二 新api
<Son>
<template slot-scope="{ images }">//解构写法
<ul>
<li v-for="(img, index) in images" :key="index">{{ img }}</li>
</ul>
</template>
</Son>
</div>
</template>
<script>
import Son from "./Son";
export default {
name: "Father",
components: {
Son,
},
data() {
return {};
},
};
</script>
展示效果