如何让vue自定义组件可以包裹内容,并且渲染出来,以及组件的组合使用

当我们用vue一开始写项目时,按需求文档自定义了一个公用组件,这个组件很多地方都用到了,然后随着项目的推进,又有了新的需求要在里面加东西,但又不是所有的地方都要加

这时候我们想这样往里面塞内容↓    <my-template>是我们自定义的公共组件

<my-template>
    <h2>想加入一个子标题</h2>
</my-template>

但这样运行代码后,发现页面还是以前的样子,这个div并没有出现,这个时候该怎么办呢

这里我们就要用到一个vue的功能:插槽slot

slot是定义在子组件里的,用来接收父组件使用时包裹的内容

<div id="app">
    <son-demo>
        <h2>新增一个子标题</h2>
    </son-demo>
</div>

<script type="text/x-template" id="sonModel">
    <h1>开始有的标题</h1>
    <slot></slot>  //这里就是用来接收父组件传过来的内容,我们也可以设置默认值,当父不传时显示
</script>

<script>
    //定义子组件
    var sonDemo = {
        template: "#sonModel",
    }
    //父组件
    new Vue({
        el: '#app',
        components: { sonDemo },
    });
</script>

这时候我们已经完成需求了,很开心,但第二天事比产品经理又来搞事情了,那就是不仅要加一个标题还要加一段内容,但这个内容并不和标题在一起中间隔了很多代码,这时候该怎么办呢

这里就要用到slot的内容分发了

<div id="app">
    <son-demo>
        <h2 slot="title">新增一个子标题</h2>
        <div slot="body">新加内容</div>
    </son-demo>
</div>

<script type="text/x-template" id="sonModel">
    <h1>开始有的标题</h1>
    <slot name="title"></slot>
    <slot name="body"></slot>
</script>

<script>
    //定义子组件
    var sonDemo = {
        template: "#sonModel",
    }
    //父组件
    new Vue({
        el: '#app',
        components: { sonDemo },
    });
</script>

其实我们不仅可以分发原生的html代码内容,也可以用其他子组件,在使用子组件时也加上slot=“body”,这样在body里面也会渲染出对应的子组件,这也就是组件的相互组合使用

 再来看一个父组件使用scope定义子组件模板结构的例子,这里有点难理解,还是需要自己动手去写一遍才能理解深刻

看了一下官网:在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的特性。

也就是把父组件使用slot时的关键字变成了v-slot,同时也加了新功能

动态参数也可以用在 v-slot 上,来定义动态的插槽名:

<base-layout>
  <template v-slot:[dynamicSlotName]>
    ...
  </template>
</base-layout>
原文地址:https://www.cnblogs.com/bobo1/p/10789380.html