vue中的slot与slot-scope

参考网站

插槽 — Vue.js

vue 使用Slot 分发内容 学习总结。 - 铅笔画不出的黑白 - 博客园

非插槽模板指的是html模板

指的是‘div、span、ul、table’这些,非插槽模板的显示与隐藏以及怎样显示由插件自身控制

插槽模板

指的是slot,它是一个空壳子,因为它显示与隐藏以及最后用什么样的html模板显示由父组件控制。但是插槽显示的位置确由子组件自身决定,slot写在组件template的哪块,父组件传过来的模板将来就显示在哪块

使用场景

当组件中某一项需要单独定义,那么就应该使用solt(组件解决特殊单独的业务逻辑的时候使用slot)。 举例说明。例如项目中需要一个模态框提示 付款成功,付款失败。那么这个模态框也就仅仅差这几个字或者是状态图片而已。那么此时应用solt就是一个非常不错的选择。

如果没有 <slot> 插口,则父组件标签内的的内容将会被丢弃。

单个插槽(匿名插槽。不用设置name属性。

当子组件模板只有一个没有属性的 slot 时,父组件整个内容片段将插入到 slot 所在的 DOM 位置,并替换掉 slot 标签本身。

备用内容在子组件的作用域内编译,并且只有在宿主元素为空,且没有要插入的内容时才显示备用内容。

父组件:

<template>
    <div class="father">
        <h3>这里是父组件</h3>
        <child>
            <div class="tmpl">
              <span>菜单1</span>
              <span>菜单2</span>
              <span>菜单3</span>
            </div>
        </child>
    </div>
</template>

子组件:

<template>
    <div class="child">
        <h3>这里是子组件</h3>
        <slot>备用</slot>     // ‘备用’为备用内容,当没有东西传入时,展现
    </div>
</template>

结果为 

<template>
    <div class="father">
        <h3>这里是父组件</h3>
         <div class="child">
            <h3>这里是子组件</h3>
            <div class="tmpl">
              <span>菜单1</span>
              <span>菜单2</span>
              <span>菜单3</span>
            </div>   
         </div>
    </div>
</template>

具名插槽

父组件:

<template>
  <div class="father">
    <h3>这里是父组件</h3>
    <child>
      <div class="tmpl" slot="up">
        <span>菜单1</span>
        <span>菜单2</span>
        <span>菜单3</span>
       
      </div>
      <div class="tmpl" slot="down">
        <span>菜单-1</span>
        <span>菜单-2</span>
        <span>菜单-3</span>
    
      </div>
      <div class="tmpl">
        <span>菜单->1</span>
        <span>菜单->2</span>
     
    </child>
  </div>
</template>

子组件:

<template>
  <div class="child">
    // 具名插槽
    <slot name="up"></slot>
    <h3>这里是子组件</h3>
    // 具名插槽
    <slot name="down"></slot>
    // 匿名插槽
    <slot></slot>
  </div>
</template>

结果为:

<template>
  <div class="father">
    <h3>这里是父组件</h3>
    <div class="child">
      <div class="tmpl">
        <span>菜单1</span>
        <span>菜单2</span>
        <span>菜单3</span>
      </div>
      <h3>这里是子组件</h3>

      <div class="tmpl">
        <span>菜单-1</span>
        <span>菜单-2</span>
        <span>菜单-3</span>
      </div>

      <div class="tmpl">
        <span>菜单->1</span>
        <span>菜单->2</span>
      </div>
    </div>
  </div>
</template>

作用域插槽 (slot待数据)

有时让插槽内容能够访问子组件中才有的数据是很有用的,例如我们想让它的后备内容显示用户的名,以取代正常情况下用户的姓,如下:

<current-user>
  {{ user.firstName }}
</current-user>

然而上述代码不会正常工作,因为只有 <current-user> 组件可以访问到 user 而我们提供的内容是在父级渲染的(子组件访问不到)

为了让 user 在父级的插槽内容可用,我们可以将 user 作为一个 <slot> 元素的特性绑定上去:

<span>
  <slot v-bind:user="user">  // 将 `user` 对象作为一个插槽的 prop 传入
    {{ user.lastName }}
  </slot>
</span>

绑定在 <slot> 元素上的特性被称为插槽 prop。现在在父级作用域中,我们可以给 v-slot 带一个值来定义我们提供的插槽 prop 的名字

<current-user>
  <template v-slot:default="slotProps">  
    // 设置slot作用于并且命名为slotProps
    // v-slot就相当于是一个对象,这个对象里面的数据就是子组件插槽绑定传上来了。
    {{ slotProps.user.firstName }}
  </template>
</current-user>

在这个例子中,我们选择将包含所有插槽 prop 的对象命名为 slotProps,但你也可以使用任意你喜欢的名字。

我们可以清晰的看到,在子组件中有个插槽slot通过v-bind绑定了一个值item,在父组件中引用了子组件child,child标签里面可以看到作用域插槽template,此时v-slot 就是一个对象,这个对象是由子组件的插槽slot所绑定的值所组成的一个对象

总结:可以绑定数据的插槽,显示内容完全由子组件决定,数据来自子组件。

注意

v-slot 指令自 Vue 2.6.0 起被引入,提供更好的支持 slot 和 slot-scope 特性的 API 替代方案。v-slot 完整的由来参见这份 RFC。在接下来所有的 2.x 版本中 slot 和 slot-scope 特性仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中

单个插槽和具名插槽:不绑定数据,所以父组件是提供的模板要既包括样式由包括内容的,上面的例子中,你看到的文字,“菜单1”,“菜单2”都是父组件自己提供的内容;

作用域插槽:父组件只需要提供一套样式(在确实用作用域插槽绑定的数据的前提下)。

动态插槽名

<base-layout>
  <template v-slot:[dynamicSlotName]>
    ...
  </template>
</base-layout>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值