前端开发那些事儿vue

vue---slot插槽

2020-06-22  本文已影响0人  Year_h

一、什么是插槽?

在进行组件化开发时,通常会遇到同一个功能,有共性的部分,也有不同的部分,此时我们就需要在子组件内,将不同的部分预留一个槽口即<slot></slot>,此时父组件在调用子组件时,就可以通过预留的槽口向子组件内插入不同的内容,实现不同内容的动态化展示,子组件内预留的槽口<slot></slot> 就是插槽。

二、插槽的作用

多个模块间具有相同的部分,又有各自不同的功能时,此时如果不想多次写重复的代码时,就可以将该多个模块抽取为一个公共组件,不同的部分设置插槽,父组件调用时通过插槽动态传递内容即可。下面是插槽应该的小例子,一个模块的标题是一样的,但是展示内容不一致。

三、插槽的应用

子组件

<template>
  <div>
    <p>listData</p>
    <slot>
      <ul>
        <li v-for="item in listData" :key="item.name">{{item.name}}</li>
      </ul>
    </slot>
  </div>
</template>

父组件

<template>
  <div>
    <Cslot>
      <h4>自己插入的插槽</h4>
    </Cslot>

    <Cslot></Cslot>
  </div>
</template>

四、具名插槽

有时我们需要多个插槽时,需要给子组件内的插槽定义一个名字,确保父组件在插入时,可以一 一对应。一个不带 name 的 <slot> 出口会带有隐含的名字“default”。

子组件

<template>
  <div>
    <p>listData</p>
    <slot>
      <ul>
        <li v-for="item in listData" :key="item.name">{{item.name}}</li>
      </ul>
    </slot>
    
    <slot name="centerSlot">
      <p>我是中间的slot</p>
    </slot>
  </div>
</template>

父组件 通过v-slot组件绑定需要对应的slot名称即可 即:v-slot:centerSlot 也可以简写为#centerSlot(适用于template模板)

<template>
  <div>
    <Cslot></Cslot>
    <Cslot>
     <template #centerSlot> 
      <div>具名插槽</div>
      <h4>自己插入的插槽</h4>
    </template>

    </Cslot>
  </div>
</template>

也可以不通过template 直接在元素上绑定需要插入的插槽名字,当与template同时存在时,template优先级最高

<template>
  <div>
    <Cslot></Cslot>
    <Cslot>
     <div slot='centerSlot'> 
          <div>具名插槽</div>
          <h4>自己插入的插槽</h4>
      </div>
    </Cslot>
  </div>
</template>

五、作用域插槽,(为了让插槽内容能够访问子组件中的数据)即父组件需要获取子组件的数据 重新修改渲染。

父组件有自己的作用域,只能访问自己作用域内的数据。

具体实现,子组件在slot上通过绑定属性将数据绑定上
父组件需要通过template模板 通过v-slot指令 获取对应slot传过来的数据(是一个对象:{{centerData:listData}},需要点传递时的属性[centerData]获取具体传过来的值[listData])。代码如下

子组件

<template>
  <div>
    <slot name="centerSlot" v-bind:centerData="listData">
      <p>我是中间的slot</p>
    </slot>
  </div>
</template>

父组件

<template>
  <div>
    <current-slot></current-slot>
    <current-slot>
      <template v-slot:centerSlot="slotProps">
        <span v-for="item in  slotProps.centerData" :key="item.name">---{{item.age}}---</span>
      </template>
    </current-slot>
  </div>
</template>
上一篇下一篇

猜你喜欢

热点阅读