首页 > 其他分享 >vue模拟el-table演示插槽用法

vue模拟el-table演示插槽用法

时间:2023-05-30 11:12:45浏览次数:40  
标签:el vue name 插槽 ChildSlot 组件 table

vue模拟el-table演示插槽用法

很多人知道插槽分为三种,但是实际到elementui当中为什么这么用,就一脸懵逼,接下来就跟大家聊一聊插槽在elementui中的应用,并且自己写一个类似el-table的组件

vue的slot分为三种::匿名插槽,具名插槽, 作用域插槽,主要作用:让父组件可以向子组件指定位置插入 html 结构,也是一种组件间通信的方式,适用于父组件=>子组件

1、匿名插槽

匿名组件相当于一个占位符,将父组件的数据传入子组件的slot标签内

父组件:

<template>
  <ChildSlot>父组件调用</ChildSlot>
</template>

<script>
import ChildSlot from "@/components/ChildSlot";
export default {
  components:{
    ChildSlot
  }
}
</script>

子组件:

<template>
  <h1>我是子组件</h1>
  <slot></slot>
</template>

<script>
export default {
  name: "ChildSlot"
}
</script>

运行结果如下:

此时父组件中的“父组件调用”这段内容就传递到了子组件,并填入了slot挖的坑当中

image

2、具名插槽

具名插槽相当于给插槽添加了一个名字(给插槽加入name属性就是具名插槽)

父组件:

<template>
    <child-slot>
      <template v-slot:username>我是父组件传递的用户姓名</template>
    </child-slot>
    <child-slot>
      <template v-slot:age>我是父组件传递的年龄</template>
    </child-slot>
</template>

<script>
import ChildSlot from "@/components/ChildSlot";
export default {
  components:{
    ChildSlot
  }
}
</script>

子组件:

<template>
  <h1>我是子组件</h1>
  <slot name="username"></slot>
  <slot name="age"></slot>
</template>

<script>
export default {
  name: "ChildSlot"
}
</script>

运行结果如下:

此时父组件中的根据slot的name,将内容填入了slot挖的坑当中,一个萝卜一个坑
image

3、作用域插槽

与前两者的不同 slot自定义:name="值" 子组件可向父组件传递信息

父组件:

<template>
    <child-slot>
      <template v-slot="{username}">我是子组件传递的用户姓名:{{username}}</template>
    </child-slot>
</template>

<script>
import ChildSlot from "@/components/ChildSlot";
export default {
  components:{
    ChildSlot
  }
}
</script>

子组件:

<template>
  <h1>我是子组件</h1>
  <slot :username="username"></slot>
</template>

<script>
export default {
  name: "ChildSlot",
  data(){
    return{
        username:'java',
    }
  }
}
</script>

运行结果如下:

通过作用域插槽,我们可以将子组件中的值传入到父组件,在父组件进行数据处理后,填坑到子组件

4、模拟写一个el-table

先看一个el-table的例子,当需要对一行中的某一个单元格的内容进行处理的时候,需要用到slot插槽,例如下面的姓名name的处理

<template>
  <el-table
      :data="tableData"
      style="width: 100%">
    <el-table-column
        label="姓名"
        width="180">
        <template slot-scope="scope">
          <el-popover trigger="hover" placement="top">
            <p>姓名: {{ scope.row.name }}</p>
            <p>住址: {{ scope.row.address }}</p>
            <div slot="reference" class="name-wrapper">
              <el-tag size="medium">{{ scope.row.name }}</el-tag>
            </div>
          </el-popover>
        </template>
    </el-table-column>
    <el-table-column
        prop="address"
        label="地址">
    </el-table-column>
  </el-table>
</template>

参照el-table,实现我们自己的table组件,讲解下为什么需要用插槽,用了哪些插槽

4.1为了传递table,首先通过匿名插槽,写一个的组件,目的就是模拟下面这三行内容

​ <el-table
​ :data="tableData"
​ style="width: 100%">

<template>
  <div>
      <slot></slot>
  </div>
</template>

<script>
export default {
  name: "MyTable"
}
</script>
4.2实现el-table-column,通过作用域插槽,写我们自己的el-table-column
<template>
  <div>
    <div>
      <!--通过传递label标签,展示表头-->
      <span v-if="label">{{ label }}</span>
    </div>
    <!--获取主页面的data值:$parent.$parent.$data.tableList-->
    <div v-for="(user,index) in $parent.$parent.$data.tableList" :key="index">
      <!--当传递prop属性的时候,就取user用户的数据-->
      <div v-if="prop">{{user[prop]}}</div>
      <!--当不传递prop属性的时候,将用户的数据通过row属性,传递到父组件当中,也就是app.vue-->
      <slot v-else :row="user"></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: "MyTableColumn",
  props: {
    prop: {type: String},
    label: {type: String}
  }
}
</script>

4.2调用my-table,my-table-column

我们通过my-table标签,将内容my-table和my-table-column放置到my-table的匿名插槽中,并通过子组件的props属性,接收prop和label。如同elementui一样,如果prop为空,子附件将父组件的user通过作用域插槽传递到父组件,并在父组件进行处理

<template>
  <div>
    <my-table :data="tableList" style="display: flex; flex-direction: row;">
      <my-table-column prop="name" label="姓名"></my-table-column>
      <my-table-column prop="sex" label="性别"></my-table-column>
      <my-table-column label="地址">
        <template v-slot="scope">
          <span style="background-color: deepskyblue">{{scope.row.address}}</span>
        </template>
      </my-table-column>
    </my-table>
  </div>
</template>

<script>
import MyTable from "@/components/MyTable";
import MyTableColumn from "@/components/MyTableColumn";
export default {
  name: 'App',
  components:{
    MyTableColumn,
    MyTable
  },
  data(){
    return{
      tableList:[
        {
          name: 'java大师1',
          sex: '男',
          address: '西藏1'
        },
        {
          name: 'java大师2',
          sex: '男',
          address: '西藏2'
        },
        {
          name: 'java大师3',
          sex: '男',
          address: '西藏3'
        },
        {
          name: 'java大师4',
          sex: '男',
          address: '西藏4'
        }
      ]
    }
  }
}
</script>

展示结果如下:

image

标签:el,vue,name,插槽,ChildSlot,组件,table
From: https://www.cnblogs.com/dalaba/p/17442682.html

相关文章

  • 汽车EDI:如何与Stellantis建立EDI连接?
    Stellantis是一家实力雄厚的汽车制造公司,由法国标致雪铁龙集团(PSA集团)和意大利菲亚特克莱斯勒汽车集团(FCA集团)合并而成,是世界上第四大汽车制造商,拥有包括标致、雪铁龙、菲亚特、克莱斯勒、道奇、Jeep、阿尔法罗密欧、兰博基尼等30多个知名品牌。Stellantis在全球范围内拥有庞大......
  • 界面组件Telerik UI for WPF可轻松实现直方图,让数据可视化更简单
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。TelerikUIforWPF|下载试用TelerikUI......
  • laravel导出excel表格中带图片
    1.用到扩展$dat=[];foreach($resDBas$k=>$v){$dat[$k]=['style_no'=>$v['style_no'],'style_name'=>$v['style_name'],......
  • PageHelper的使用和原理
    一、使用说明:publicPageInfo<MonitoringRecordDTO>monitorRecordPage(MonitoringRecordVOvo){PageHelper.startPage(vo.getPage(),vo.getRows());List<MonitoringRecordDTO>recordDTOList=realTimeMapper.selectMonitorRecordList(vo);returnnew......
  • Elasticsearch专题精讲——API规范——多索引
    API规范——多索引ElasticsearchRESTAPI使用HTTP协议,采用JOSN格式。 大多数API都支持跨多个索引执行,可以使用简单的test1,test2,test3表示法(或对所有索引执行,用_all)。它还支持通配符,例如test*或te*t或*test,以及排除(-),例如-test3. 所有多索引API都支持以......
  • Linux 06 Shell
    Shell脚本脚本声明#!/bin/bash脚本注释#examplescript脚本命令uptimefree-hreboot脚本执行$catxiaoxian.sh#!/bin/bash#xiaoxian.sh#thisscriptistest#2023-05-09datels-lfree-huname-a$bashxiaoxian.sh接收用户输入$catha......
  • el-cascader 切换数据源时报错
    问题根据属性类型加载el-cascader不同的数据源选项,会报错如下:尝试猜测是:el-cascader上次的绑定值没有清空,而切换属性类型导致数据源选项不同,以致于无法在新的选项中找到绑定值,从而报错。于是,设置了切换属性类型时,把el-cascader的绑定值重置为[]。但仍然存在这个报错。......
  • Shell - shell中的运算符
    基本语法使用案例   基本语法$((运算式))$[运算式]  使用案例#第一种写法a=10b=20c=`expr${a}+${b}`echo"$c"#第二种写法c=$[`expr10+20`]echo"$c"#第三种写法c=$[10+20]echo"$c"#计算3加2的值expr3+2#计算3减2的值e......
  • vue前端的avue-crud操作
     1、在js中获取某个字段的属性,或设置字段的值:constcolumn=this.findObject(this.option.column,"parentId");column.disabled=true;//设置为禁用此字段column.value='1';//设置parentId字段的value值console.log("column属性:",co......
  • 基于SCCM Baseline修正Lenovo高通X55 WWAN过度记录导致C盘空间被占满的问题
    背景近期有大量使用LenovoThinkPad系列的计算机C盘磁盘空间被占满。经过分析发现:位于%ProgramData%\Qualcomm®Snapdragon™X555GModem\SVClog下的日志文件占用了大量磁盘空间。本文为微风原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址。原因分......