基于vue+Element Table Popover 弹出框内置表格的封装

这篇具有很好参考价值的文章主要介绍了基于vue+Element Table Popover 弹出框内置表格的封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

在选择数据的时候需要在已选择的数据中对比选择,具体就是点击一个按钮,弹出一个小的弹出框,但不像对话框那样还需要增加一个遮罩层,更加的轻量化,但是需要查看的数据很多需要一个列表来展示,列表的话还需要一个筛选功能。

我的思路是增加复选框列,将选择的内容插入到外部的列表中,我这里主要是分享弹出框内置列表的一个封装思路。
但是在这当中还会设计到列表、分页的方法,所以建议先搞清楚列表以及分页在来看,这些我之前的文章都有涉及。


实现效果

基于vue+Element Table Popover 弹出框内置表格的封装,VUE,vue.js,javascript,前端,elementui

认识组件

老样子先根据Element的官方文档认识一下Popover 弹出框

代码

<el-popover
  placement="right"
  width="400"
  trigger="click">
  <el-table :data="gridData">
    <el-table-column width="150" property="date" label="日期"></el-table-column>
    <el-table-column width="100" property="name" label="姓名"></el-table-column>
    <el-table-column width="300" property="address" label="地址"></el-table-column>
  </el-table>
  <el-button slot="reference">click 激活</el-button>
</el-popover>

<script>
  export default {
    data() {
      return {
        gridData: [{
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        }]
      };
    }
  };
</script>

效果

基于vue+Element Table Popover 弹出框内置表格的封装,VUE,vue.js,javascript,前端,elementui

分析

这个是一个基础的Popover 弹出框,在这当中我们要用到的方法、函数有:

  • placement:出现位置 :top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-end
  • width:弹出框宽度:800 (最小宽度 150px)
  • popper-class:为 popper 添加类名:popover
  • show:显示时触发:handlePopoverShow
  • v-model:状态是否可见:visible
  • trigger:触发方式:click/focus/hover/manual

这些就是在Popover 弹出框中要用到的内置方法及函数


封装:

代码

<!-- 

  component:Popover弹出框(内置列表)
  time:2023/08/10

  placement:位置
  popoverText:按钮文字
  popoverIcon:按钮图表
  tableType:MultipleChoice(单选)、CheckBox(多选)
  tableData:列表数据
  tableConfig:列表配置
  loading:开启列表加载
  totalNum:分页总数
  width:宽度
  handlePopoverShow:弹出框显示触发
  handleSizeChange:分页条数
  handleCurrentChange:分页页数
  handleSelectData:确定触发事件

-->
<template>
  <div class="popover">
    <el-popover
      :placement="placement"
      :width="width"
      popper-class="popover"
      @show="handlePopoverShow"
      v-model="visible"
      trigger="click">
      <el-form ref="PopoverQuery" label-width="80px" class="PopoverQuery">
        <el-card shadow="hover">
          <el-form-item :label="$t('query_condition')" class="PopoverQuery-FormItem">
            <el-input class="PopoverQuery-Input" :placeholder="placeholder"></el-input>
            <el-button size="mini" icon="el-icon-search">{{$t('Query')}}</el-button>
          </el-form-item>
        </el-card>
      </el-form>
      <Table ref="table" :total="totalNum" @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange" :loading="loading" :tableData="tableData" :tableConfig="tableConfig" :tableType="tableType" @RowClick="tableRowClick" @HandleSelectionChange="selectionChange"></Table>
      <div class="mar-top-10" style="overflow: hidden;">
        <!-- 单选清空 -->
        <el-button size="mini" class="FloatRight" icon='el-icon-refresh' @click="EmptyTableSelectStatus('MultipleChoice')" v-if="tableType=='MultipleChoice'">{{ $t('empty') }}</el-button>
        <!-- 多选清空 -->
        <el-button size="mini" class="FloatRight" icon='el-icon-circle-close' @click="cancel('CheckBox')" v-else>{{ $t('Cancel') }}</el-button>
        <el-button size="mini" type="success" class="card-title-button"  @click="handleSelectData" style="margin-right:10px" icon='el-icon-circle-check'>{{ $t('determine') }}</el-button>
      </div>
      <el-button size="mini" class="card-title-button" :icon='popoverIcon' slot="reference">{{ popoverText }}</el-button>
    </el-popover>
  </div>
  
</template>

<script>
import Table from '@/components/table/index.vue'
export default {
  components:{Table},
  data() {
    return {
      visible:false, 
      selectData:[] //复选框选择的数据
    };
  },
  props:{
    popoverText:{
      default(){
        return [];
      }
    },
    popoverIcon:{
      default(){
        return [];
      }
    },
    tableData:{
      default(){
        return [];
      }
    },
    tableConfig:{
      default(){
        return [];
      }
    },
    tableType:{
      default(){
        return [];
      }
    },
    loading:{
      type:Boolean,
      default: false
    },
    width:{
      type:String,
      default:'500',
    },
    totalNum:{
      type:Number,
      default:0
    },
    placement:{
      type:String,
      default:'bottom'
    },
    placeholder:{
      type:String,
      default:'',
    }
  },
  methods:{
    tableRowClick(row,type){  //单选列表行点击事件
      console.log(type,row);
    },
    selectionChange(row){ //多选列表复选框点击事件
      this.selectData = row
    },
    cancel(){  
      this.visible = false
    },
    handlePopoverShow(){  //弹出框显示触发
      this.$emit('handlePopoverShow',true)
    },
    handleSizeChange(val) { //分页条数
      this.$emit('handleSizeChange',val)
    },
    handleCurrentChange(val) {  //分页页数
      this.$emit('handleCurrentChange',val)
    },
    handleSelectData(){	//确认触发事件
      this.$emit('handleSelectData',this.selectData)
      this.visible = false
    }
  }
};
</script>

<style lang="scss" scoped>
.popover{
  float: right;
  padding-bottom: 0px;
}
.PopoverQuery{
  overflow: hidden;
  &-FormItem{
    margin-bottom: 0px;
  }
  &-Input{
    float: left;
    width: 70%;
    margin-right: 10px;
  }
}
::v-deep .el-table__header-wrapper{
  position: sticky;
  top: -12px;
  z-index: 9;
}
::v-deep .el-table__body-wrapper {
  height: 310px;
  overflow-y: scroll;
}
</style>

这里我们要用到的字段除了上述的还有很多,因为这个是内置了三个组件的封装组件。

封装思路

  • placement:位置
  • popoverText:按钮文字
  • popoverIcon:按钮图表
  • width:宽度
  • tableType:MultipleChoice(单选)、CheckBox(多选)
  • tableData:列表数据
  • tableConfig:列表配置
  • loading:开启列表加载
  • totalNum:分页总数
  • handlePopoverShow:弹出框显示触发
  • handleSizeChange:分页条数
  • handleCurrentChange:分页页数
  • handleSelectData:确定触发事件
  1. 首先是将placement,popoverText,popoverIcon,tableType,width传给组件定义按钮的样式,类型
  2. 点击按钮触发handlePopoverShow函数,将事件传给页面,页面开始请求接口,这时会将loading该为开启状态
  3. 后端回传数据后,将loading状态重置,在将tableData,tableConfig,totalNum传给组件,此时列表中已经可以查看到数据了
  4. 最后handleSelectData在执行剩下的逻辑

我这里面还嵌入了一个form表单来作为数据的校验,但是还没写全,其实就是按照正常的form表单验证写就行了文章来源地址https://www.toymoban.com/news/detail-730250.html

页面中使用

  //调用示例
  <Popover 
    style="float: left;height: 28px;"
    placement="right"
    :popoverText="this.$t('add_product_details')" 
    popoverIcon="el-icon-thumb"
    :tableData="productTableData" 
    :tableConfig="productTableConfig"
    :tableType="'CheckBox'"
    :loading="productTableloading"
    :totalNum="paging.totalNum"
    width="800"
    @handlePopoverShow="getFirstLegOrderlog"
    @handleSizeChange="handleSizeChange"
    @handleCurrentChange="handleCurrentChange"
    @handleSelectData="handleSelectData"
  >
  </Popover>

到了这里,关于基于vue+Element Table Popover 弹出框内置表格的封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Element-UI中el-table内嵌el-popover,在表格翻页后el-popover无法显示问题解决

    由于开发需求,需要在el-table某一列增加popover弹窗,当用户点击按钮时,通过popover组件展示详细信息。参考Element-ui官网文档案例,得出代码如下 具体实现细节无需关注,经过测试后表格第一页的popover组件能够正常显示,但是当翻到第二页时,点击详情按钮,函数能够被正常

    2024年02月11日
    浏览(53)
  • vue2 el-table行悬停时弹出提示信息el-popover

    实现方法,用到了cell-mouse-enter、cell-mouse-leave两个事件,然后在表格的首列字段中,加个el-popover组件,当然你也可以选择在其他字段的位置来显示提示框,看自己的需求了。 示例代码: 在enter方法中,还可以根据row行数据进行一些处理,比如根据状态status来判断是否弹出提示

    2024年01月18日
    浏览(69)
  • 基于 Vue3 + Webpack5 + Element Plus Table 二次构建表格组件

    基于 Vue3 + Webpack5 + Element Plus Table 二次构建表格组件,开箱即用 A Vue 3.x Table Component built on Webpack 5 该组件库可供学习、参考和用于二次开发。 1.基于 Webpack 5 构建 2.全面支持 Vue 3 3.支持 JSON 序列化表格快速配置 4.已内置 Pagination 分页 5.支持自定义 prop 列名 6.支持单元格内容自

    2024年04月13日
    浏览(84)
  • element dialog弹出框层级错乱问题

    需要加modal-append-to-body 默认为true,遮罩层是否插入至 body 元素上,若为 false,则遮罩层会插入至 Dialog 的父元素上。 为false时的HTML结构   为true时的HTML结构   出现弹框层级错乱问题时可以modal-append-to-body是否设置为false了。  

    2024年02月15日
    浏览(44)
  • vue2/3 - 基于element(ui/plus)实现el-table表格每行可拖动换位置排序,表格列(表头)可拖动交换位置功能效果(table表格可拖曳排序的行和列,用鼠标动态拖拽排序表格行列)

    在vue2、vue3项目开发中,element饿了么组件库实现表格el-table组件支持【行和列可拖曳排序、换位置】功能,每行数据可拖拽进行排序调换位置,每列数据可以自由拖动进行调换位置。 提供详细示例代码,复制源码换个数据就能用了。

    2024年04月13日
    浏览(64)
  • Vue 3,element table表格动态添加

            el-table实现表格动态新增/插入/删除表格行,可编辑单元格 效果图 代码实现 

    2024年01月19日
    浏览(44)
  • element-ui 的el-popover 自定义弹出和关闭

    业务需求: 鼠标悬停打开弹窗,点击弹窗里面的内容后关闭弹窗 Element 中 Popover 弹出框的弹出方式有 hover,click,focus,手动激活几种方式,根据业务需求,可以如下使用: el-popover弹出框 关闭和打开分别用 doClose() 和 doShow() 方法 ,Element UI文档中没有提到这两个方法 通过方

    2024年02月16日
    浏览(63)
  • Vue Element-ui Table表格排序

    一.表格中有时候会有排序的需求,如果只针对当前页进行排序,那么前端就可以实现排序,在对应需要排序的字段中,使用sortable字段即可。 二.存在分页的情况时,前端仅仅使用sortable当前页排序已经不能满足我们的需求,无法对所有数据进行排序。这时候我们就要使用后端

    2024年02月11日
    浏览(51)
  • element-plus 设置 el-date-picker 弹出框位置

    概述:el-date-picker 组件会自动根据空间范围进行选择比较好的弹出位置,但特定情况下,它自动计算出的弹出位置并不符合我们的实际需求,故需要我们手动设置。 存在的问题:element-plus 中 el-date-picker 文档中并没有提供明确的属性供我们设置弹出位置。 解决方案:我们可以

    2024年02月09日
    浏览(49)
  • vue中element-ui表格组件el-table封装,在table表格中插入图片

            这次写的项目是写后台管理系统这部分,对于后台管理使用vue写,用组件的话,table组件用得次数比较多,可以封装一个table组件。         1.如封装的table组件:  :prop=\\\"item.prop\\\"  :label=\\\"item.label\\\"是必须要有的,其他的可以根据自己需要写 。 2.封装之后是就是使

    2024年02月15日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包