【Vue】插槽-slot

📝个人主页:五敷有你

🔥系列专栏:Vue

⛺️稳中求进,晒太阳

插槽

作用:让组件内部一些 结构 支持 自定义

插槽的分类:

  • 默认插槽。
  • 具名插槽。

基础语法

组件内需要定制的结构部分,改用占位

html 复制代码
<template>
    <div class="main">
        <h2>确认吗</h2>
        <slot></slot>
        <div class="bottom">
            <button>确认</button><button>取消</button>
        </div>
    </div>
</template>

使用组件时,标签内部,传入结构替换slot

html 复制代码
<BaseA>我是插槽练习</BaseA>

插槽的默认值

通过插槽完成内容的定制,传什么显示什么,但是不传,则是空白

插槽的后备内容:封装组件时,可以为预留的插槽提供后备内容(默认内容)

  • 语法:在slot标签内,放置内容,作为默认显示内容
  • 效果:
    • 外部使用组件不传东西,则slot会显示后备内容
    • 外部使用组件传东西了,则slot整体会被替换掉

具名插槽(一个组件有多处结构需要外部传入标签,进行定制)

语法:

多个slot使用name属性区分名字

简写:v-slot:插槽名 简化---- #插槽名

html 复制代码
    <div class="main">
        <h2>
            <slot name="head"></slot>
        </h2>
        <slot name="body">我是默认值</slot>
        <div class="bottom">
            <slot name="foot"></slot>
        </div>
    </div>

template配置v-slot:名字 来分发对应标签

html 复制代码
   <BaseA>
      <template v-slot:head>
        我是标题
      </template>
    <template v-slot:body>
      <p>我是身体</p>
    </template>
    <template v-slot:foot>
      <button>确认</button><button>取消</button>
    </template>
    </BaseA>

作用域插槽

作用域插槽:定义slot插槽的同时,是可以传值的,给插槽上 可以绑定数据, 将来 使用组件时可以用

场景:封装表格组件

基本使用步骤:

  1. 给slot标签,以添加属性的方式传值。
html 复制代码
<slot :id="item.id" msg="测试文本"></slot>
  1. 所有添加属性,都会收集到一个对象中
html 复制代码
{id:3,msg:"测试文本"}
  1. 在template中,通过 #插槽名='obj'接收,默认插槽名为 default
html 复制代码
<MyTable :list="list">
    <template #default="obj">
        <button @click="del(obj.id)">删除</button>
    </template>
   </MyTable> 

商品列表(实战):

App.vue

html 复制代码
<template>
  <div id="app">
    <MyTable :list="list">
      <template #thead>
          
            <td>编号</td>
          <td>图片</td>
          <td>名称</td>
          <td>标签</td>
       
      </template>
      <template #tbody="{item,index}" >
            <td>{{ index+1 }}</td>
            <td>{{ item.img }}</td>
            <td>{{ item.name }}</td>
            <td><MyEle v-model="item.sign"></MyEle></td>
      </template>
    </MyTable>
  </div>
</template>

<script>

import MyEle from "./components/MyEle.vue"
import MyTable from "./components/MyTable.vue"
export default {
  data(){
    return{
      list:[
      {id:101,img:'001',name:"紫砂壶",sign:"茶具"},
      {id:102,img:'001',name:"皮鞋",sign:"男鞋"},
      {id:103,img:'001',name:"棉衣",sign:"衣服"},
      {id:104,img:'001',name:"毛衣",sign:"衣服"},
      {id:105,img:'001',name:"帽子",sign:"衣服"}
  ]
    }
 
  },

components:{
 MyEle,
 MyTable
},
methods:{
  
},


//局部注册指令
directives:{
  //指令名:指令配置项
    color:{
      inserted(el,binding){
        el.style.color=binding.value
      },
      update(el,binding){
        el.style.color=binding.value
      }
    }
},

}



</script>

<style scoped>
#app {
  
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;

  margin-top: 60px;
  display: flex;
  justify-content: space-around;
}

</style>

MyTable.vue

html 复制代码
<template>
<div class="main">
    <table border="1">
        <thead>
            <tr>
                <!-- <td>编号</td>
                <td>图片</td>
                <td>名称</td>
                <td>标签</td> -->
                <slot name="thead">

                </slot>
            </tr>
        </thead>
        <tbody>
            <tr v-for="(item,index) in list" :key="item.id">
                <slot name="tbody" :item="item" :index="index" ></slot>
            </tr>
              
        </tbody>
    </table>
</div>
</template>
<script>

export default {
    props:{
        "list":Array,
        

    }
}
</script>
<style scoped>

</style>

Mytag.vue

html 复制代码
<template>
<div class="main">
    <div class="ele" v-if="isShow" @click="isShow=false">
       {{ value }}
    </div>
    <div v-else>
        <input type="text" :value="value" v-focus @keyup.enter='update'>
    </div>
</div>
    
    
</template>
<script>

export default {
    props:{
       
        "value":String
    },
    data(){
        return {
           
            isShow:true,
        }
    },
    directives:{
        focus:{
            inserted(el){
                el.focus()
            }
        }
    },
    methods:{
        update(e){
            
            this.$emit("input",e.target.value)
            this.isShow=true
        }
    }
}
</script>
<style scoped>
.ele{
    text-align: center;
    color:rgb(50, 49, 49);
    font-size: 15px;
}
input{
    padding: 3px 4px;
    color:gray;
    font-size: 13px;
}
</style>
相关推荐
花花鱼5 分钟前
@antv/x6 导出图片下载,或者导出图片为base64由后端去处理。
vue.js
流烟默24 分钟前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch
蒲公英10012 小时前
vue3学习:axios输入城市名称查询该城市天气
前端·vue.js·学习
杨荧4 小时前
【JAVA开源】基于Vue和SpringBoot的旅游管理系统
java·vue.js·spring boot·spring cloud·开源·旅游
一 乐9 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
小御姐@stella10 小时前
Vue 之组件插槽Slot用法(组件间通信一种方式)
前端·javascript·vue.js
万叶学编程13 小时前
Day02-JavaScript-Vue
前端·javascript·vue.js
积水成江16 小时前
关于Generator,async 和 await的介绍
前端·javascript·vue.js
计算机学姐16 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
老华带你飞16 小时前
公寓管理系统|SprinBoot+vue夕阳红公寓管理系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot·课程设计