vue---slot插槽

作者: Year_h | 来源:发表于2020-06-22 17:47 被阅读0次

    一、什么是插槽?

    在进行组件化开发时,通常会遇到同一个功能,有共性的部分,也有不同的部分,此时我们就需要在子组件内,将不同的部分预留一个槽口即<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>
    

    相关文章

      网友评论

        本文标题:vue---slot插槽

        本文链接:https://www.haomeiwen.com/subject/zxixfktx.html