具名插槽slot与v-solt插槽
使用插槽分成两步。
第一步 在组件元素内。为其它元素设置插槽名称。
通过slot属性设置。
第二步 在组件模板中,通过slot组件,使用这些元素。
通过name属性指令插槽名称
如果没有设置name属性,默认会使用剩余的元素。
使用插槽的时候,默认会引入slot属性所在的元素,
不想引入该元素,我们可以使用template模板元素。
使用template模板元素的时候,在新版本中,建议用v-slot指令代替slot属性
此时为插槽定义名称的语法是冒号语法。
v-slot:名称
注意:该指令不能给普通元素使用,如div,h1,span等。
只能给组件和template元素使用。
<div id="app">
<h1>parent</h1>
<!-- 使用子组件 -->
<home>
<!-- 1 设置插槽名称 -->
<template slot="header">
<h1>header</h1>
</template>
<!-- 普通元素不能使用 只能组件和template元素使用 会报错-->
<!-- <div v-slot:demo></div> -->
<!-- 没有指定名称的插槽 -->
<div>
<h1>body</h1>
</div>
<!-- 新版本中,建议使用v-slot指令 -->
<template v-slot:footer>
<h1>footer</h1>
</template>
</home>
</div>
<!-- 模板 -->
<template id="tpl">
<div>
<!-- 2 使用插槽 -->
<slot name="header"></slot>
<!-- 没有指定名称 -->
<slot></slot>
<h1>home component</h1>
<slot name="footer"></slot>
</div>
</template>
import Vue from 'vue';
// 第二个子组件
let Home = Vue.extend({
template: '#tpl'
})
// vue实例化对象
new Vue({
// 注册
components: { Home },
// 容器
el: '#app',
// 数据
data: {}
})
插槽作用域
作用域是指:在插槽中使用的数据存储在哪里。
默认在插槽中,使用的数据是父组件中的数据(插槽使用的元素,是在父组件模板中定义的)。
在插槽元素中,使用子组件中的数据分成两步。
第一步 为slot组件,传递子组件的数据
动态传递数据,使用v-bind指令
第二步 为v-slot指令赋值,定义接收数据的命名空间(作用域名称)
接收的数据,驼峰式命名
此时在元素中,通过该命名空间,可以使用传递的数据,
v-slot指令语法糖是#。
<div id="app">
<h1>parent</h1>
<!-- 使用子组件 -->
<home>
<!-- 语法糖 -->
<template #header="childScope">
<!--msg: 'parent msg' -->
<h1>header -- {{msg}}</h1>
<!-- 这里传递的是 color属性 以及子组件中的数据 以及:child-msg -->
<h1>{{childScope}}</h1>
<!-- 语法糖 childScope 传递的color为red childMsg传递的是子组件中的msg -->
<h1>{{childScope.color}}--{{childScope.childMsg}}</h1>
</template>
</home>
</div>
<!-- 模板 -->
<template id="tpl">
<div>
<!-- 1 传递属性 -->
<slot name="header" color="red" :child-msg="msg"></slot>
<!-- <h1>home component</h1> -->
<input type="text" v-model="msg">
</div>
</template>
import Vue from 'vue';
// 第二个子组件
let Home = Vue.extend({
template: '#tpl',
// 数据
data() {
return {
msg: 'child msg'
}
}
})
// vue实例化对象
new Vue({
// 注册
components: { Home },
// 容器
el: '#app',
// 数据
data: {
msg: 'parent msg'
}
})