什么是插槽
混合父组件的内容与子组件自己的模板,弥补视图的不足。这个过程称为内容分发。
插槽,也就是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.headerlet text = header[0].elm.innerTextlet html = header[0].elm.innerHTMLconsole.log(header);console.log(text);console.log(html);}</script>
