Vue 组件 - Slot 内容分发

 Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件 - Slot 内容分发

目录

Slot内容分发

旧版slot

单插槽

使用插槽

具名插槽

插槽实现导航

使用插槽优点

新版slot

Or

插槽版抽屉

总结


Slot内容分发

混合父组件的内容和子组件自己模板 -- 内容分发

父组件模板的内容在父组件作用域内编译,子组件模板内容在子组件作用域内编译。

旧版slot

如果直接在组件内部放入自定义内容是无法显示的;

slot插槽技术,可以在组件内部自定义显示内容。

单插槽

首先创建一个组件,在组件中设置好插槽位置,注意slot是固定的。

示例如下:

<script>
    Vue.component("child", {
        template:`
        <div>
            child
            <slot></slot>
        </div>
        `
    })

    let vm = new Vue({
        el:"#box"
    })
</script>

使用插槽

写一行会在插槽中显示一行,多行的话,也会出现多行;

示例如下:

<div id="box">
    <!--当前组件或者节点 在哪个模板中,就能访问哪个模板状态-->
    <child>
        <div>面朝大海</div>
        <div>春暖花开</div>
    </child>
</div>

效果如下:

这叫做单个插槽写法。

具名插槽

如果要使用多个自定义内容的,可以使用具名插槽。

修改原有组件内容,改为具名插槽格式。

示例如下:

Vue.component("child", {
    template:`
    <div>
        child
        <slot name="a"></slot>
        <slot name="b"></slot>
        <slot name="c"></slot>
        <slot></slot>
    </div>
    `
})

组件使用slot,进行对号入座。

示例如下:

<div id="box">
    <!--当前组件或者节点 在哪个模板中,就能访问哪个模板状态-->
    <child>
        <div slot="a">面朝大海</div>
        <div slot="b">春暖花开</div>
        <div slot="c">从明天起做一个快乐的人</div>
        <div>劈柴喂马 关心粮食和蔬菜</div>
    </child>
</div>

效果如下:

插槽实现导航

利用slot可以实现导航栏和导航图标的灵活显示。

使用slot插槽后不再受到内置组件限制。

示例如下:

<div id="box">
    <!--当前组件或者节点 在哪个模板中,就能访问哪个模板状态-->
    <navbar>
        <button slot="left"> < 返回</button>
        <i class="icon" slot="right">字体图标</i>
    </navbar>
</div>
<script>
    Vue.component("navbar", {
        template:`
        <div>
            <slot name="left"></solt>
            <span>navbar</span>
            <slot name="right"></solt>
        </div>
        `
    })

    let vm = new Vue({
        el:"#box"
    })
</script>

使用插槽优点

通过插槽自定义导航栏两侧的内容。

扩展组件能力,提高组件复用性。

新版slot

新版slot是2.6版本的vue。并不是3后的版本。

以前的slot不知道算属性还是指令。

现在明确为指令写法,#号为简写方式,上面是指令写法。

定义组件和插槽不需修改。

示例如下:

<child>
    <template v-slot:a>
        <div>面朝大海</div>
    </template>
    <template v-slot:b>
        <div>春暖花开</div>
    </template>
</child>
Or
<navbar>
    <template #left>
        <button> < 返回 </button>
    </template>
    <template #right>
        <i class="icon">字体图标</i>
    </template>
</navbar>

 官网示例

插槽版抽屉

对原有的抽屉(子传父示例)改为插槽版。

即原来的导航列表的打开和关闭功能。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<script src="../lib/vue.js"></script>
<div id="box">
  <navbar>
    <button @click="isShow=!isShow">点击</button>
  </navbar>
  <sidebar v-show="isShow"></sidebar>
</div>
<script>
  // 定义一个全局组件
  Vue.component("navbar", {
    template: `<div style="background-color: red">
            nabbar- <slot></slot>
        </div>`,
  })

  Vue.component("sidebar", {
    template:`<div style="background-color: yellow">
    <ul>
    <li>第一行</li>
    <li>第二行</li>
    <li>第三行</li>
</ul>
</div>`
  })
  let vm = new Vue({
    el:"#box",
    data:{
      isShow: true
    }
  })
</script>
</body>
</html>

 去掉Vue原有监听和触发事件,只通过isShow取反后的值判断来显示。

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件 -  Slot 内容分发