slot插槽
<body>
<script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
<div id='myApp'>
<!-- 在组件标签中间写的内容默认不渲染, 因为这些数据会被传入子组件由子组件渲染, 子组件模板中使用slot标签接收这些数据 -->
<my-com>这是子组件</my-com>
<!-- 组件标签通过插槽传值,可以传递任意标签结构 -->
<my-com>
<ul>
<li>111</li>
<li>222</li>
<li>333</li>
</ul>
</my-com>
</div>
<!-- 组件模板 -->
<template id='myTem'>
<div>
<!-- slot标签叫做插槽, 可以接收组件标签中间写的数据 -->
<slot></slot>
<hr>
<!-- 每一个slot都会渲染一次插槽数据 -->
<slot></slot>
</div>
</template>
<script>
Vue.component('myCom', {
template: '#myTem',
// 组件对象中拿不到slot插槽数据, 无法对插槽数据进行监听和修改
})
new Vue({
el: '#myApp',
data: {
}
})
</script>
</body>
具名插槽
slot标签添加name属性叫具名插槽, 可以接收slot属性相对应的标签, 具名插槽可实现插槽数据的拆分,并插入不同的位置
<body>
<script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
<div id='myApp'>
<my-com>
<h1 slot="myName">{{name}}</h1>
<h2 slot="myage">{{age}}</h2>
</my-com>
</div>
<!-- 组件模板 -->
<template id='myTem'>
<div>
父组件中的name: <slot name="myName"></slot>
父组件中的age: <slot name="myage"></slot>
</div>
</template>
<script>
Vue.component('myCom', {
template: '#myTem',
data(){
return{
}
}
})
new Vue({
el: '#myApp',
data: {
name : "张三",
age: 20
},
created() {
// 插槽传值, 父组件数据更新后,子组件会同步更新
setTimeout(() => {
this.name = "李四",
this.age = 30
}, 1000);
},
})
</script>
</body>