当前位置: 首页 > news >正文

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>

相关文章:

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

数据少的话&#xff0c;可以前端实现&#xff0c;如果多的话&#xff0c;建议还是请求接口比较合理父组件&#xff1a; <template> <div class"home"> <!-- <img alt"Vue logo" src"../assets/logo.png"> <HelloWorld …...

【SpringBoot3学习 | 第1篇】SpringBoot3介绍与配置文件

文章目录 前言 一. SpringBoot3介绍1.1 SpringBoot项目创建1. 创建Maven工程2. 添加依赖(springboot父工程依赖 , web启动器依赖)3. 编写启动引导类(springboot项目运行的入口)4. 编写处理器Controller5. 启动项目 1.2 项目理解1. 依赖不需要写版本原因2. 启动器(Starter)3. Sp…...

SpringBoot整合Dubbo的快速使用教程

目录 一、什么是Dubbo? 二、SpringBoot整合Dubbo 1、父工程引入依赖 2、各个Dubbo服务子模块引入依赖 3、服务提供者 &#xff08;1&#xff09;启动类添加注解EnableDubbo &#xff08;2&#xff09;服务类添加注解DubboService &#xff08;3&#xff09;配置文件…...

昇思25天学习打卡营第12天| 基于MindNLP+MusicGen生成自己的个性化音乐

之前都是看图文类的东西&#xff0c;今天体验一点不一样的。来点听力的内容。 mindspore有音乐生成模型MusicGen&#xff0c;MusicGen支持两种生成模式&#xff1a;贪心&#xff08;greedy&#xff09;和采样&#xff08;sampling&#xff09;。在实际执行过程中&#xff0c;采…...

代理设计模式和装饰器设计模式的区别

代理设计模式: 作用:为目标(原始对象)增加功能(额外功能,拓展功能) 三种经典应用场景: 1&#xff1a;给原始对象增加额外功能(spring添加事务,Mybatis通过代理实现缓存功能等等) 2&#xff1a;远程代理&#xff08;网络通信&#xff0c;输出传输&#xff08;RPC&#xff0c;D…...

[Microsoft Office]Word设置页码从第二页开始为1

目录 第一步&#xff1a;设置页码格式 第二步&#xff1a;设置“起始页码”为0 第三步&#xff1a;双击页码&#xff0c;出现“页脚”提示 第四步&#xff1a;选中“首页不同” 第一步&#xff1a;设置页码格式 第二步&#xff1a;设置“起始页码”为0 第三步&#xff1a;双…...

【C++】日期类

鼠鼠实现了一个日期类&#xff0c;用来练习印证前几篇博客介绍的内容&#xff01;&#xff01; 目录 1.日期类的定义 2.得到某年某月的天数 3.检查日期是否合法 4.&#xff08;全缺省&#xff09;构造函数 5.拷贝构造函数 6.析构函数 7.赋值运算符重载 8.>运算符重…...

力扣热100 滑动窗口

这里写目录标题 3. 无重复字符的最长子串438. 找到字符串中所有字母异位词 3. 无重复字符的最长子串 左右指针left和right里面的字符串一直是没有重复的 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 左右指针leftright0ans0#初始化结果tablecolle…...

三万字带你一遍跑通uer

三万字带你一遍跑通uer 参考文档 今天给大家介绍个非常强大的项目uer&#xff0c;集成了许多可以做自然语言的东西&#xff0c;效果的话也非常好&#xff0c;很适合企业级的应用&#xff01; 1. 先将项目uer从github拉取下来&#xff08;zip或git都ok&#xff09; 2. 用pycha…...

Ubuntu24.04LTS基础软件下载

librewolf: deb文件link 作用&#xff1a;访问github&#xff0c;无痕浏览&#xff0c;这个速度&#xff0c;不指望了 vscodium: 从deb安装&#xff0c;ubuntu sudo dpkg -i xxx.debpaste-image 插件替代 markdown wps: libreoffice: 替换USTC源 sudo nano /etc/apt/sourc…...

SQLAlchemy配置连接多个数据库

1.定义配置项 首先定义两个数据库的配置信息 # PostgreSQL database configuration DB_USERNAMEpostgres DB_PASSWORDpassord DB_HOST127.0.0.1 DB_PORT5432 DB_DATABASEtest# mysql database configuration DB_USERNAME_MYSQLroot DB_PASSWORD_MYSQLpassword DB_HOST_MYSQL127…...

NLP+LLM从入门到精通系列

NLPLLM从入门到精通系列 前言&#xff1a;笔者从事于NLPLLM的对话智能机器人的相关行业&#xff0c;现在的大模型的技术日新月异&#xff0c;传统的NLP业务显然是要被淘汰的&#xff0c;那么这也是我着笔写这一系列文章的初衷。本系列将由浅到深&#xff0c;结合实际代码案例&…...

用数组手搓一个小顶堆

堆默认从数组下标为1开始存储。 const int N201000; int heap[N]; int len; 插入操作&#xff1a; 将元素插入到堆的末尾位置向上调整。 void up(int k){while(k>1&&heap[k/2]>heap[k]){swap(heap[k],heap[k/2]);k/2;} } //len为当前存在元素长度 void Inser…...

【Linux开发】基于ALSA库实现音量调节

基于ALSA库实现音量调节 ALSA库实现音量调节1、使用alsamixer工具查看音频接口2、完整代码2.1、snd_mixer_open2.2、snd_mixer_attach、2.3、snd_mixer_selem_register2.4、snd_mixer_load2.5、snd_mixer_first_elem/snd_mixer_elem_next2.6、snd_mixer_selem_get_playback_vol…...

代理IP在未来将面临哪些挑战?

今天我们来聊聊代理IP在未来可能会面临的挑战。虽然代理IP技术目前应用广泛&#xff0c;但随着科技的发展和网络环境的变化&#xff0c;代理IP也将面临一些新的挑战。让我们一起来看看这些挑战是什么吧&#xff01; 1. 更严格的网络封锁和检测 现代社会各行各业都在飞速发展&…...

FineBI在线学习资源-数据处理

FineBI在线学习资源汇总&#xff1a; 学习资源 视频课程 帮助文档 问答 数据处理学习文档&#xff1a; 相关资料&#xff1a; 故事背景概述-https://help.fanruan.com/finebi6.0/doc-view-1789.html 基础表处理-https://help.fanruan.com/finebi6.0/doc-view-1791.html …...

【代码随想录算法训练营第37期 第四十五天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III】

代码随想录算法训练营第37期 第四十五天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III 一、198.打家劫舍 解题代码C&#xff1a; class Solution { public:int rob(vector<int>& nums) {if (nums.size() 0) return 0;if (nums.size() 1) return num…...

Elasticsearch查询上下文和_source

查询上下文 {"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation"…...

golang实现网卡流量监控

获取当前时刻一分钟前的网卡流量排序 package mainimport ("fmt""github.com/mackerelio/go-osstat/network""log""net/http""sort""strconv""time" )var arr []map[string]int var arr2 []map[string]…...

技术分享:直播平台如何开发并接入美颜SDK

本篇文章&#xff0c;笔者将分享直播平台如何开发并接入美颜SDK的技术细节与步骤。 一、选择合适的美颜SDK 首先&#xff0c;选择一款适合的美颜SDK非常重要。市面上有很多优秀的美颜SDK供应商&#xff0c;选择时应考虑以下因素&#xff1a; 功能丰富性&#xff1a;支持美白…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...