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

news2024/10/7 20:28:55

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

<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.coloradmin.cn/o/1898155.html

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

相关文章

Spring源码十一:事件驱动

上一篇Spring源码十&#xff1a;BeanPostProcess中&#xff0c;我们介绍了BeanPostProcessor是Spring框架提供的一个强大工具&#xff0c;它允许我们开发者在Bean的生命周期中的特定点进行自定义操作。通过实现BeanPostProcessor接口&#xff0c;开发者可以插入自己的逻辑&…

ServiceImpl中的参数封装为Map到Mapper.java中查询

ServiceImpl中的参数封装为Map到Mapper.java中查询&#xff0c;可以直接从map中获取到key对应的value

吴恩达机器学习作业ex7:K 均值聚类和主成分分析(Python实现)详细注释

文章目录 1 K 均值聚类1.1 实施 K-means1.1.1 寻找最近的中心点1.1.2 计算中心点均值 1.2 示例数据集上的 K-means1.3 随机初始化1.4 用 K-means 压缩图像1.4.1 对像素进行 K 均值分析 2 主成分分析2.1 样例数据集2.3 利用 PCA 降低维度2.3.1 将数据投影到主成分上2.3.2 重建数…

满足GMSL静电防护要求的方案

什么是GMSL&#xff1f;它是做什么用的&#xff1f;它有什么优点&#xff1f;设计GMSL防静电有啥难度&#xff1f; 带着这些疑问我们先了解下什么是GMSL。 一&#xff0e;简述 GMSL GMSL&#xff08;Gigabit Multimedia Serial Link&#xff09;即千兆多媒体串行链路&#xf…

vs code 波浪线报错

这种红色波浪线的 VS code 报错&#xff0c;之前我都是直接忽略&#xff0c;因为不影响运行&#xff0c;但是我看着就很闹心想要给它去掉。 明明这个module 在啊&#xff0c;为啥一直报错 Cannot find module 今天知道原因了&#xff1a; 为了图方便&#xff0c;我 的 VS …

HPR3B-30A1-201、HPR3B-30A2-211-M4液压比例减压阀放大器

HANDOK HYDRAULIC比例减压阀HPR2P-30A1-201、HPR2P-30A1-201-M5、HPR3S-40A1-201-M3、HPR3Q-40A1-201-M2、HDPR3Q-40A1-201-M0、HPR3B-30A2-211、HPR3B-40F1-212 FOR SBS120/140、HDSV4B-A1-232、HPR3NB-30A-221、HDSV3B-A1-232-GO-PVD、HPR3B-30A1-213、HSVD3B-A1-232-GO-PSVD…

网络-calico问题分析

项目场景&#xff1a; calico-node日志提示 Failed to auto-detect host MTU - no interfaces matched the MTU interface pattern. To use auto-MTU, set mtuifacePattern to match your hosts’s interfaes. 同时&#xff0c;cali开头网卡的mtu是1440大小 原因分析&#xff…

每日复盘-20240705

今日关注&#xff1a; 20240705 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------300391--------- 长药控股 三日涨幅最大: ------1--------300391--------- 长药控股 二日涨幅最…

windows安装jdk21

下载 下载zip解压 设置环境变量 设置JAVA_HOME环境变量 Path环境变量添加如下值%HAVA_HOME%\bin 打开新的cmd&#xff0c;输入java --version查看效果

C++学习第十三天——stack/queue的使用及底层剖析双端队列容器适配器

✨ 少年的旅途应是星辰大海 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…

安装Linux虚拟机

点击创建新的虚拟机 选择高级 系统自定义推荐 选择稍后安装 选择Linux 虚拟机命名并且选择创建位置 系统自定义 系统自定义推荐 系统自定义推荐 选择安装好的iOS文件 点击完成 选择编辑虚拟机设置 进入后选择第一个Install red hat enterprise 选择常用语言 设置…

【数据结构】(6.3)堆的应用——堆排序(C语言)

系列文章目录 文章目录 系列文章目录前言1. 堆排序的基础知识2. 堆排序详解2.1 堆排序整体思路2.2 思路详解2.2.1 建堆2.2.2 堆排序完整代码2.2.3 输出数据 3. 时间复杂度分析 前言 1. 堆排序的基础知识 堆排序&#xff08;Heap Sort&#xff09;就是对直接选择排序的一种改进…

springboot dynamic配置多数据源

pom.xml引入jar包 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.2</version> </dependency> application配置文件配置如下 需要主要必须配置…

NET程序开发可能会用到的一些资料文档

NET程序开发使用的一些资料文件&#xff0c;NET高级调试&#xff0c;NET关键技术深入解析&#xff0c;WPF专业编程指南&#xff0c;程序员求职攻略&#xff0c;WPF编程宝典等。 下载链接&#xff1a;https://download.csdn.net/download/qq_43307934/89518582

c++重定向输出和输出(竞赛讲解)

1.命令行重定向 在命令行中指定输出文件 指令 .\重定向学习.exe > 1.txt 效果 命令行输入和输出 指令 .\重定向学习.exe < 2.txt > 1.txt 效果 代码 #include<bits/stdc++.h> using namespace std; int n; int main(){cin>>n;for(int i=0;i<n;i…

自动化设备上位机设计 二

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 namespace 自动化上位机设计 {public partial class Form1 : Form{public Form1(){InitializeComponent();timer1.Enabled true;timer1.Tick Timer1_Tick;}private void Timer1_Tick(object? sender, EventArgs e)…

UrbanGPT: Spatio-Temporal Large Language Models

1.文章信息 本次介绍的文章是2024年arxiv上一篇名为《UrbanGPT: Spatio-Temporal Large Language Models》的文章&#xff0c;UrbanGPT旨在解决城市环境中的时空预测问题&#xff0c;通过大语言模型&#xff08;LLM&#xff09;的强大泛化能力来应对数据稀缺的挑战。 2.摘要 Ur…

Qt实现流动的管道效果代码示例

在现代图形用户界面&#xff08;GUI&#xff09;应用程序中&#xff0c;动态效果可以显著增强用户体验。本文将介绍如何使用Qt框架实现一个流动的管道效果。我们将通过自定义QWidget来绘制管道&#xff0c;并使用定时器来实现流动效果。 1. 准备工作 首先&#xff0c;确保你已…

【Linux进阶】磁盘分区2——MBR和GPT

1.磁盘的分区 因为如果你的磁盘被划分成两个分区&#xff0c;那么每个分区的设备文件名是什么&#xff1f; 在了解这个问题之前&#xff0c;我们先来复习一下磁盘的组成&#xff0c;因为现今磁盘的划分与它物理的组成很有关系。 我们谈过磁盘主要由碟片、机械手臂、磁头与主轴马…

计算机视觉 图像融合技术概览

在许多计算机视觉应用中(例如机器人运动和医学成像),需要将来自多幅图像的相关信息集成到一幅图像中。这种图像融合将提供更高的可靠性、准确性和数据质量。 多视图融合可以提高图像的分辨率,同时恢复场景的 3D 表示。多模态融合结合了来自不同传感器的图像,称为多传感器融…