什么是插槽
混合父组件的内容与子组件自己的模板,弥补视图的不足。这个过程称为内容分发。
插槽,也就是slot,是组件的一块HTML模板,一个slot最核心的两个问题是显示不显示和怎样显示
组件编译的作用域
先看一段代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>插槽slot</title>
</head>
<body>
<div id="app">
<my-component></my-component>
{{message}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
Vue.component('my-component', {
template: '<div></div>',
data() {
return {
message: '我是子组件message的内容'
}
}
})
let app = new Vue({
el: '#app',
data: {
message: '我是父组件message的内容'
},
})
</script>
</body>
页面上渲染 message 的时候,出现的会是父组件 data 内容,因为整个 app 都是父组件的作用域,
如果想在子组件中使用 message,那只能在 my-component 的 template 中使用
插槽解决的问题就是在父组件中插入内容
插槽用法
单个插槽
<body>
<div id="app">
<my-component>
<p>在父组件插入的内容</p>
</my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
Vue.component('my-component', {
template:
' <div>\n' +
' <slot>\n' +
' 默认出现的内容\n' +
' </slot>\n' +
' </div>',
data() {
return {
message: '我是子组件message的内容'
}
}
})
let app = new Vue({
el: '#app',
data: {
message: '我是父组件message的内容'
},
})
</script>
具名插槽
<!--html-->
具名插槽 <br>
<lala-component>
<h3 slot="header">标题</h3>
<p>正文 1</p>
<p>正文 2</p>
<p slot="footer">底部信息</p>
</lala-component>
<script>
Vue.component('lala-component', {
template:
' <div>\n' +
' <div class="hearder"><slot name="header"></slot></div>\n' +
' <div class="content"><slot></slot></div>\n' +
' <div class="footer"><slot name="footer"></slot></div>\n' +
' </div>',
})
</script>
作用域插槽
作用域插槽是一种特殊的slot,使用一个可以复用的模板来替换已经渲染的元素
简单来说就是从子组件获取数据
<!--html-->
作用域插槽 <br>
<dida-component>
<template slot="dida" slot-scope="prop">
{{prop.text}}
</template>
</dida-component>
<script>
Vue.component('dida-component',{
template:
'<div>\n' +
' <slot text="我是子组件的数据" name="dida"></slot>\n' +
'</div>'
})
</script>
访问 slot
<script>
mounted() {
let header = this.$slots.header
let text = header[0].elm.innerText
let html = header[0].elm.innerHTML
console.log(header);
console.log(text);
console.log(html);
}
</script>