el-table封装点击列筛选行数据功能,支持筛选,搜索,排序功能

数据少的话,可以前端实现,如果多的话,建议还是请求接口比较合理父组件:

<template>

  <div class="home">

    <!-- <img alt="Vue logo" src="../assets/logo.png">

      <HelloWorld msg="Welcome to Your Vue.js App" /> -->

    <el-button @click="calculateSum">求和</el-button>

    <el-input v-model="searchValue"></el-input>

    <el-table :data="tableData" height="250" border style="width: 100%;position: relative;" id="table1">

      <el-table-column prop="date" label="日期" width="180">

        <template v-slot:header>

          <i class="el-icon-search" style="margin-right: 15px;" @click.stop="filterData($event, 'date')"></i>

          <span class="table-heard-filter" style="color: red; font-weight: bold;">0</span>

        </template>

      </el-table-column>

      <el-table-column prop="name" label="姓名" width="180">

        <template v-slot:header>

          <el-checkbox v-model="checked2" @change="changeFnc('name')"></el-checkbox>

          <i class="el-icon-search" style="margin-right: 15px;" @click.stop="filterData($event, 'name')"></i>

          <span class="table-heard-filter">1</span>

        </template>

      </el-table-column>

    </el-table>

    <TableTool v-if="showFilterTool" ref="selectTool" :filterToolLeft="filterToolLeft" :filterToolTop="filterToolTop"

      @closeTool="closeTool" @saveSeach="saveSeach" :ids="ids" :type="type" />

  </div>

</template>

<script>

// @ is an alias to /src

import HelloWorld from '@/components/HelloWorld.vue'

import TableTool from '@/components/TableTool.vue'

import ColumnDialog from './ColumnDialog.vue'

import { Checkbox } from 'element-ui';

export default {

  name: 'HomeView',

  components: {

    HelloWorld,

    TableTool,

    ColumnDialog

  },

  data() {

    return {

      checked: false,

      checked2: false,

      summaryShow: false,

      summary: [],  // 用于存放总计数据的数组

      searchValue: "",

      CheckboxArr: [],

      ids: [], // 初始化ids为空数组

      type: "",

      currentSummaryColumn: null, // 当前点击的列名

      tableData: [{

        date: '2016-05-03',

        name: 56,

        address: 8,

        id: "0"

      }, {

        date: '2016-05-02',

        name: 78,

        address: 8,

        id: "1"

      }, {

        date: '2016-05-04',

        name: 0,

        address: 8,

        id: "2"

      }

      ],

      showFilterTool: false,

      CheckboxArr: [],

      ids: [],

      type: "",

      currentSummaryColumn: null // 当前点击的列名

    }

  },

  mounted() {

    localStorage.setItem('CheckboxArr', JSON.stringify(this.tableData))

    // this.scroll()

    this.closeTableToolFnc()

  },

  beforeDestroy() {

    // this.scroll()

    this.closeTableToolFnc()

  },

  methods: {

    //子组件只用@click.stop防止事件冒泡,父组件单击任意位置关闭子组件

    closeTableToolFnc() {

      document.addEventListener("click", (e) => {

        // if (!this.$refs.selectTool.contains(e.target)) {

        this.closeTool()

        // }

      });

    },

    filterData(e, type) {

      console.log(type);

      this.type = type

      this.showFilterTool = false;

      this.$nextTick(() => {

        this.filterToolTop = e.pageY;

        this.filterToolLeft = e.pageX;

        this.ids = []

        this.tableData.forEach(t => {

          this.ids.push(t.id)

        })

        this.showFilterTool = true;

      });

    },

    closeTool() {

      this.showFilterTool = false;

    },

    saveSeach(data) {

      this.tableData = []

      this.tableData = data

      this.closeTool();

    },

  }

}

</script>

<style>

.Tableone ::-webkit-scrollbar,

::-webkit-scrollbar-track,

::-webkit-scrollbar-thumb {

  display: none

}

</style>

子组件:

<template>

    <div class="tableTool" :style="{ top: filterToolTop + 30 + 'px', left: filterToolLeft - 20 + 'px' }" @click.stop>

        <el-button @click="shengFnc">升序</el-button>

        <el-button @click="jiangFnc">降序</el-button>

        <el-input v-model="keyword" prefix-icon="el-input__icon el-icon-search" type="text" placeholder="搜索"

            @blur="blurFnc"></el-input>

        <div class="select-box">

            <el-checkbox v-model="checkAll" @change="handleCheckAllChange">全选</el-checkbox>

            <el-checkbox-group v-model="checkedList">

                <el-checkbox v-for="(item, index) in CheckboxArr" :label="item.id" :key="index" :value="item.id">

                    <span>{{ item[type] }}</span>

                </el-checkbox>

            </el-checkbox-group>

        </div>

        <div class="bottom">

            <el-button size="mini" @click="$emit('closeTool')">取消</el-button>

            <el-button type="primary" size="mini" @click="save">确认</el-button>

        </div>

        <i class="el-icon-caret-top"></i>

    </div>

</template>

<script>

export default {

    name: "tableCol",

    props: {

        filterToolLeft: {

            required: true,

            type: Number

        },

        filterToolTop: {

            required: true,

            type: Number

        },

        ids: {

            type: Array

        },

        type: {

            type: String

        }

    },

    data() {

        return {

            keyword: "",

            checkAll: false,

            checkedList: [],

            options: [],

            isIndeterminate: true,

            allOptions: [],

            CheckboxArr: JSON.parse(localStorage.getItem('CheckboxArr')),

            c: []

        };

    },

    mounted() {

    },

    methods: {

        shengFnc() {

            this.CheckboxArr.sort((a, b) => a.id - b.id);

        },

        jiangFnc() {

            this.CheckboxArr.sort((a, b) => b.id - a.id);

        },

        blurFnc() {

            console.log(this.keyword);

            if (this.keyword) {

                this.CheckboxArr = this.CheckboxArr.filter(item => {

                    if (this.$props.type == 'date') {

                        return item.date == this.keyword;

                    } else {

                        return item.name == this.keyword;

                    }

                });

            } else {

                this.CheckboxArr = JSON.parse(localStorage.getItem('CheckboxArr'))

            }

        },

        handleCheckAllChange(val) {

            console.log(val, this.checkedList);

            this.checkedList = val ? this.CheckboxArr.map(item => item.id) : [];

        },

        save() {

            this.c = []

            this.CheckboxArr.forEach(r => {

                this.checkedList.forEach(i => {

                    if (r.id == i) {

                        this.c.push(r)

                    }

                })

            })

            this.$emit("saveSeach", this.c);

        },


 

    },

    mounted() {

        console.log(this.CheckboxArr, "传入的数据");

        this.checkedList = [...this.$props.ids]

        if (this.CheckboxArr.length == this.checkedList.length) {

            this.checkAll = true

        } else {

            this.checkAll = false

        }

    },

};

</script>

<style scoped>

.tableTool {

    position: fixed;

    background: #fff;

    box-shadow: 0 0 5px #ccc;

    padding: 10px;

    z-index: 999;


 

}

/deep/.el-input__inner {

    padding-left: 30px;

}

.select-box {

    border: #ccc solid 1px;

    padding: 10px;

    margin-top: 10px;

    max-height: 280px;

    overflow: auto;

    max-width: 400px;

}

/deep/ .el-checkbox {

    display: block;

    margin-top: 5px;

}

/deep/ .el-radio-group {

    display: flex;

    flex-direction: column;

}

.bottom {

    display: flex;

    justify-content: flex-end;

    margin-top: 10px;

}

.el-icon-caret-top {

    position: absolute;

    color: #fff;

    top: -13px;

    font-size: 20px;

}

.el-checkbox:last-of-type {

    margin-right: none;

}

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/41417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hilbert编码 思路和scala 代码

需求&#xff1a; 使用Hilbert 曲线对遥感影像瓦片数据进行编码&#xff0c;获取某个区域的编码值即可 Hilbert 曲线编码方式 思路 大致可以对四个方向的数据进行归类 左下左上右上右下 这个也对应着编码的顺序 思考在不同Hilbert深度&#xff08;阶&#xff09;情况下的…

【fastadmin开发实战】经营数据自动识别录入

项目场景描述&#xff1a;每日录入各个门店的员工经营数据&#xff0c;直接从微信复制报数、系统识别录入。 解决方案&#xff1a;各个门店按照固定的汇报模板进行汇报&#xff08;如福田店有员工1、2、3、4、5号员工&#xff0c;每个员工按模板报数&#xff09; 例如&#xf…

JMH320【亲测】【御剑九歌】唯美仙侠手游御剑九歌+WIN学习手工端+视频教程+开服清档+运营后台+授权GM物品充值后台

资源介绍&#xff1a; 这也是仙梦奇缘的一个游戏 注意&#xff1a;外网14位IP或域名 ———————————————————————————————————– ps后台介绍: 1区运营后台&#xff1a;http://ip:9981/admin/admintool/ 2区运营后台&#xff1a;http://ip…

Day44:LeedCode 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

188. 买卖股票的最佳时机 IV 给你一个整数数组 prices 和一个整数 k &#xff0c;其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说&#xff0c;你最多可以买 k 次&#xff0c;卖 k 次。 注意&…

[深度学习]卷积理解

单通道卷积 看这个的可视化就很好理解了 https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md 多通道卷积 当输入有多个通道时,卷积核需要拥有相同的通道数. 假设输入有c个通道,那么卷积核的每个通道分别于相应的输入数据通道进行卷积,然后将得到的特征图对…

51单片机STC89C52RC——14.1 直流电机调速

目录 目的/效果 1&#xff1a;电机转速同步LED呼吸灯 2 通过独立按键 控制直流电机转速。 一&#xff0c;STC单片机模块 二&#xff0c;直流电机 2.1 简介 2.2 驱动电路 2.2.1 大功率器件直接驱动 2.2.2 H桥驱动 正转 反转 2.2.3 ULN2003D 引脚、电路 2.3 PWM&…

智能光伏开发都能用到什么软件和工具?

随着全球对可再生能源的日益重视和光伏技术的快速发展&#xff0c;智能光伏开发已成为推动能源转型的重要力量。在光伏项目的全生命周期中&#xff0c;从设计、建设到运营管理&#xff0c;各种软件和工具的应用发挥着至关重要的作用。 一、光伏系统设计软件 1、PVsyst PVsyst…

Linux 端口

什么是虚拟端口 计算机程序之间的通讯&#xff0c;通过IP只能锁定计算机&#xff0c;但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序&#xff0c;确保程序之间进行沟通。 IP地址相当于小区地址&#xff0c;在小区内可以有许多用户&#xff08;程序&#xff09;&…

植物大战僵尸融合版最新版1.0下载及安装教程

《植物大战僵尸融合版》最新版1.0已经发布&#xff0c;为粉丝们带来了全新的游戏体验。这个版本由B站UP主蓝飘飘fly精心打造&#xff0c;引入了创新的植物融合玩法&#xff0c;让玩家可以享受策略和创意的结合。以下是游戏的详细介绍和安装指南&#xff1a; 游戏特色介绍 全新…

基于深度学习的图像背景剔除

在过去几年的机器学习领域&#xff0c;我一直想打造真正的机器学习产品。 几个月前&#xff0c;在参加了精彩的 Fast.AI 深度学习课程后&#xff0c;似乎一切皆有可能&#xff0c;我有机会&#xff1a;深度学习技术的进步使许多以前不可能实现的事情成为可能&#xff0c;而且开…

Java--继承

1.继承的本质是对某一批类的抽象&#xff0c;从而实现对世界更好的建模 2.extends的意思是“扩展”&#xff0c;子类是父亲的扩展 3.Java中只有单继承&#xff0c;没有多继承 4.继承关系的两个类&#xff0c;一个为子类&#xff08;派生类&#xff09;&#xff0c;一个为父类…

欧科云链大咖对话:Web3原生创新静默期,科技巨头却在两极化发展

出品&#xff5c;OKG Research 作者&#xff5c;Hedy Bi 上周末&#xff0c;欧科云链研究院接受FT中文的邀请&#xff0c;作为圆桌嘉宾参与了由FT中文网与上海交通大学上海高级金融学院联合主办的金融大师课。在圆桌环节&#xff0c;笔者与各位教授和金融行业科技创新前沿实践…

案例精选 | 聚铭网络助力南京市玄武区教育局构建内网日志审计合规体系

南京市玄武区教育局作为江苏省教育领域的先锋机构&#xff0c;其工作重点涵盖了教育政策的实施、教育现代化与信息化的融合、教育资源的优化、教育质量的提升以及教育公平的促进。在这一背景下&#xff0c;网络安全管理成为了确保教育信息化顺利推进的关键环节之一。 根据玄武…

Nacos单机部署、集群部署以及Nacos默认持久化derby数据库和配置mysql数据库

1. Nacos Windows 下载 1.1 去nacos官网下载nacos-server 发布历史 | Nacos 官网https://nacos.io/download/release-history/ 下载版本为 nacos-server-2.3.1.zip 2. Derby数据库 2.1 默认使用Derby数据库 官网下载Derby数据库即可。 Apache Derby数据库https://db.apac…

昇思25天学习打卡营第9天|MindSpore使用静态图加速(基于context的开启方式)

在Graph模式下&#xff0c;Python代码并不是由Python解释器去执行&#xff0c;而是将代码编译成静态计算图&#xff0c;然后执行静态计算图。 在静态图模式下&#xff0c;MindSpore通过源码转换的方式&#xff0c;将Python的源码转换成中间表达IR&#xff08;Intermediate Repr…

VSCode远程服务器

一、安装VSCode Windows安装Visual Studio Code(VS Code)-CSDN博客 二、VSCode中安装Remote-SSH插件 1、在应用商店中搜索Remote - SSH并安装 2、安装后会出现下面标注的图标 三、开始SSH连接 1、点击加号&#xff0c;创建SSH连接 2、输入地址&#xff0c;格式是&#xff1a;…

文件打开的系统错误分析流程

当用户出现“Open file failed”错误时&#xff0c;手动产生dump文件。 &#xff08;1&#xff09;打开资源管理器&#xff0c;选择AppNameXXX.exe进程&#xff0c;右击鼠标选择“创建转储文件” (2) 生成转储文件 3.获取用户转储文件 4.用Visual studio2015打开dump文件分析…

人工智能系列-numpy(三)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 副本和视图 副本 副本是一个数据的完整的拷贝&#xff0c;如果我们对副本进行修改&#xff0c;它不会影响到原始数据&#xff0c;物理内存不再同一位置。副本一般发生在Pytho…

Vue前端打包

关于NGINX 介绍:Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;在各大型互联网公司都有非常广泛的使用。 NGiMx 官网:https://nginx.org/ conf 配置文件目录 html静态资源文件目录 lo…

html+js+css在线倒计时

代码在图片后面 点赞加关注 谢谢大佬照顾&#x1f61c; 图例 时间到前 时间到后 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width,…