组件插槽

插槽也是组件传值的一种方式

组件的最大特性就是重用,而用好插槽能大大提高组件的可重用能力。

通俗的来讲,插槽无非就是在子组件中挖个坑,坑里面放什么东西由父组件决定。

插槽类型有:

单个(匿名)插槽

匿名插槽一般就是使用单个插槽(因为单个插槽就一个,所以不需要指定具体的名字)

注意:子组件的slot标签中允许书写内容,当父组件不往子组件传递内容时,slot中的内容才会被展示出来。

<div id="app">
<child>{{msg}}</child>
<data-li v-for='iteam in data'>
{{iteam}}
</data-li>
</div>
<script src="./js/vue.js"></script>
<script>
Vue.component("child", {
template: `<div>
儿子挖了个坑,填什么由父亲决定,比如说<slot>1111</slot>。
</div>`,
});
Vue.component("data-li",{
template: `<li>我是<slot>名字</slot>的父亲</li>`,
})
new Vue({
el: "#app",
data:{
data:['老马','老王','张三'],
msg:"这是插槽",
}
});
</script>

具名插槽

slot 元素可以用一个特殊的特性 name 来进一步配置如何分发内容。多个插槽可以有不同的名字,具名插槽将匹配内容片段中有对应 slot 特性的元素(填坑的内容会根据名字去匹配slot)。

<div id="app">
<app-layout>
<h2 slot="tou">我是头</h2>
<p style="color: violet;">中新网12月14日电 (张奥林)美国总统大选日已过去月余,驴象之争下,拜登与特朗普到底谁赢了,至今尚无定论。</p>
<p>虽然拜登本人及国际社会普遍认为拜登已胜选,但特朗普方面仍未承认败选。2020年12月14日,美国选举人团将进行投票,这或将使本次大选的结果“尘埃落定”。</p>
<h2 slot="jiojio">我是jio</h2>
</app-layout>
</div>
<script src="./js/vue.js"></script>
<script>
Vue.component('app-layout',{
template: `
<div>
<header>
<slot name="tou"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="jiojio"></slot>
</footer>
</div>
`
})
new Vue({
el: "#app"
})
</script>

作用域插槽

应用场景:

父组件对子组件的内容进行加工处理(子传父)

作用域插槽是一种特殊类型的插槽,(子)作用域插槽会绑定了一套数据,父组件可以拿这些数据来用,于是,情况就变成了这样:

样式父组件说了算,但父组件中内容可以显示子组件插槽绑定的数据。

<div id="app">
<!-- b. 父传子 -->
<child :username="username">
<div slot-scope="props">
<!-- f. 父亲接收到新的名字,调用自己的方法去处理数据 -->
<button @click="modusername(props.newname)">
修改用户名
</button>
</div>
</child>
</div>
<script src="./js/vue.js"></script>
<script>
Vue.component("child", {
// c. 子接收
props: ["username"],
data() {
return {
// d. 定义新的数据
newname: "zhangsan",
};
},
// e. 将新名字传递给了父
template: `<div>用户名:{{username}}<slot :newname="newname"></slot></div>`,
});
new Vue({
el: "#app",
data: {
// a. 初始用户名
username: "admin",
},
methods: {
// g. 父亲更新自己的数据
modusername: function (newname) {
// h. 执行更新
this.username = newname;
},
},
});
</script>

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。