element表格自定义筛选

这篇具有很好参考价值的文章主要介绍了element表格自定义筛选。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

提示:这里可以添加本文要记录的大概内容:

…待续


提示:以下是本篇文章正文内容,下面案例可供参考

一、简介

修改el-table的筛选…待续

二、效果展示

element表格自定义筛选,vue.js,javascript,前端
element表格自定义筛选,vue.js,javascript,前端

三、源码

使用方法

<el-table-column
  align="center"
  prop="status"
  :column-key="'status'"
>
  <template #header>
    <div class="layout-center-center">
      <span>路由状态</span>
      <table-filter
        placeholder="按路由状态搜索"
        filter-key="status"
        sortable
        :options="routeStatusList"
        @confirm="handleFilter"
        :checked-list="tempFlow.status_list"
        :sequence="tempFlow.sequence"
      ></table-filter>
    </div>
  </template>
  <template #default="{ row }">
    <span v-if="row.status == 0" style="color: green"
      >[{{ row.status }}]{{ row.status_desc }}</span
    >
    <span v-else style="color: red"
      >[{{ row.status }}]{{ row.status_desc }}</span
    >
  </template>
</el-table-column>

组件源码

<template>
  <div class="table-filter" @click.stop>
    <el-popover
      ref="popoverRef"
      popper-class="table-filter-box"
      placement="bottom"
      :width="250"
      trigger="click"
      @show="handleShow"
      @hide="handleHide"
    >
      <template #reference>
        <el-icon v-if="showParams.showSelectBox"><ArrowUp /></el-icon>
        <el-icon v-if="!showParams.showSelectBox"><ArrowDown /></el-icon>
      </template>
      <section class="table-filter-btns">
        <el-input
          v-if="filter"
          v-model="searchKey"
          :placeholder="placeholder"
          size="mini"
          class="filte-input"
          @input="search"
        />
        <el-divider v-if="filter" />
        <el-scrollbar max-height="200px" ref="scrollbarRef" v-if="filter">
          <div>
            <el-checkbox
              v-model="checkAll"
              label="全部"
              size="large"
              @change="selectAll"
            />
          </div>
          <div
            class="infinite-list-item"
            v-for="option in showOptions"
            :key="option"
          >
            <el-checkbox
              v-model="option.checked"
              :label="option.label"
              size="large"
              @change="selectItem(option.value, option.checked)"
            />
          </div>
        </el-scrollbar>
        <el-divider v-if="filter" />
        <div v-if="props.sortable">
          <el-checkbox v-model="sortable_asc" label="ASC" />
          <el-checkbox v-model="sortable_desc" label="DESC" />
        </div>
        <el-divider v-if="props.sortable" />
        <section class="btns">
          <el-button type="primary" size="small" @click="handleConfirm"
            >筛选</el-button
          >
          <el-button
            size="small"
            color="#ff5722"
            style="color: #fff"
            @click="handleCancel"
            >取消</el-button
          >
        </section>
      </section>
    </el-popover>
    <el-icon v-if="checkedList.length > 0"><Filter /></el-icon>
    <el-icon v-if="sortable_asc"><CaretTop /></el-icon>
    <el-icon v-if="sortable_desc"><CaretBottom /></el-icon>
  </div>
</template>

<script setup>
import { defineProps, reactive, ref, watch } from "vue";
const props = defineProps({
  placeholder: {},
  options: {},
  filterKey: {},
  checkedList: {
    type: Array,
    default: [],
  },
  sequence: {},
  sortable: {
    type: Boolean,
    default: false,
  },
  filter: {
    type: Boolean,
    default: true,
  },
});
let curCheckedList = _.cloneDeep(props.checkedList);
let curSequence = props.sequence;
const emit = defineEmits(["confirm"]);

const scrollbarRef = ref();
const popoverRef = ref();
let searchKey = ref();
let checkAll = ref(true); //默认全选
let showOptions = ref([]);
let showParams = reactive({
  showSelectBox: false, //展示下拉框
});
let timer = ""; //处理输入事件的定时器,一次只允许一个定时器存在,避免过度刷新造成的卡顿
let timer_ = "";
let sortable_asc = ref(false);
let sortable_desc = ref(false);
let ifDoSearch = false; // 是否正在处理输入的数据中...
const init = (sequence) => {
  showOptions.value = _.cloneDeep(props.options);
  if (curCheckedList.length == props.options.length) {
    checkAll.value = true;
  } else {
    checkAll.value = false;
  }
  if (!sequence) {
    sortable_asc.value = false;
    sortable_desc.value = false;
  } else if (sequence == "ASC") {
    sortable_asc.value = true;
  } else if (sequence == "DESC") {
    sortable_desc.value = true;
  }
};
init(curSequence);

// 点击全选
const selectAll = (checked) => {
  if (checked) {
    curCheckedList = [];
    showOptions.value = showOptions.value.map((item) => {
      item.checked = true;
      curCheckedList.push(item.value);
      return item;
    });
  } else {
    showOptions.value = showOptions.value.map((item) => {
      item.checked = false;
      return item;
    });
    curCheckedList = [];
  }
};

// 勾选当前选项
const selectItem = (id, checked) => {
  if (checked) {
    curCheckedList.push(id);
    if (curCheckedList.length == props.options.length) {
      checkAll.value = true;
    }
  } else {
    curCheckedList.splice(curCheckedList.indexOf(id), 1);
    checkAll.value = false;
  }
};

/**
 * @desc 确认事件
 */
const handleConfirm = () => {
  emit("confirm", {
    key: props.filterKey,
    checkedList: curCheckedList,
    sequence: curSequence,
  });
  props.checkedList = _.cloneDeep(curCheckedList);
  props.sequence = curSequence;
  popoverRef.value.hide();
};

/**
 * @desc 取消事件
 */
const handleCancel = () => {
  popoverRef.value.hide();
  curCheckedList = _.cloneDeep(props.checkedList);
  init(props.sequence);
};

// 下拉框展示触发的事件
const handleShow = (e) => {
  showParams.showSelectBox = true;

  if (props.filter) {
    scrollbarRef.value.setScrollTop(0);
  }
};
const handleHide = (e) => {
  showParams.showSelectBox = false;
};

function search(query) {
  if (ifDoSearch) {
    clearTimeout(timer);
    clearTimeout(timer_);
  }

  timer = setTimeout(filterMethod(query), 0);
  ifDoSearch = true;
}

function filterMethod(query) {
  let tmp = [];
  if (query !== "") {
    timer_ = setTimeout(() => {
      props.options.forEach((item) => {
        if (
          item.label.toLowerCase().indexOf(query.toLowerCase()) > -1 ||
          item.value == -1
        ) {
          tmp.push(item);
        }
      });
      showOptions.value = tmp;
    }, 0);
  } else {
    showOptions.value = props.options;
  }
  ifDoSearch = false;
}

watch(
  () => sortable_asc.value,
  (newValue, oldValue) => {
    if (newValue === oldValue) {
      return;
    } else if (newValue) {
      curSequence = "ASC";
      sortable_desc.value = false;
    } else if (!newValue) {
      curSequence = "";
    }
  }
);

watch(
  () => sortable_desc.value,
  (newValue, oldValue) => {
    if (newValue === oldValue) {
      return;
    } else if (newValue) {
      curSequence = "DESC";
      sortable_asc.value = false;
    } else if (!newValue) {
      curSequence = "";
    }
  }
);
</script>

<style lang="less" scoped>
:deep(.el-divider--horizontal) {
  margin: 12px 0px;
}
:deep(.el-popper) {
  padding: 0px;
}
:deep(.el-popover) {
  padding: 0px;
}
.table-filter {
  display: inline-block;
  cursor: pointer;
}
.table-filter-box {
  height: 25px;
  line-height: 25px;
}
.table-filter-icon {
  font: 500;
  font-size: 18px;
}
.filte-input {
  width: 100%;
}
.btns {
  float: right;
}
.infinite-list {
  padding: 0;
  margin: 0;
  list-style: none;
}
</style>


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。文章来源地址https://www.toymoban.com/news/detail-740940.html

到了这里,关于element表格自定义筛选的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【分页表格】Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)

    这篇文章,主要介绍Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)。 目录 一、分页表格 1.1、运行效果 1.2、运行环境 1.3、案例代码

    2024年02月11日
    浏览(59)
  • vue3+element Plus实现表格前端分页

    每一处都写了注释,还是很容易看懂的  

    2024年02月11日
    浏览(59)
  • 前端vue自定义table 表格 表格组件 Excel组件

    前端组件化开发与Excel组件设计 一、前端开发的复杂性与组件化的必要性 随着技术的发展,前端开发的复杂度越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。

    2024年02月09日
    浏览(56)
  • vue搭配element-ui前端实现表格分页

    如果不从后台请求数据,那么就需要在前端手动管理数据。可以使用以下步骤实现该功能: 在 Vue 组件的 data 中定义一个数组来存放所有数据(不分页)。 在 mounted 钩子函数中,手动获取数据并存放到上一步定义的数组中。 在模板中使用 element-ui 的表格组件来展示数据,同

    2024年02月11日
    浏览(44)
  • 在Vue+element UI项目中 自定义表格索引实现序号倒序排列

    实现效果:不分页 分页: 第一页 分页: 第二页     element-ui文档说明 element-ui的官方文档是默认升序:  如果设置了tyle=index可以传递index属性自定义索引

    2024年02月11日
    浏览(39)
  • 前端-vue+elment-ui之表格自定义列模版

    日前vue3项目中用elment-ui表格封装一个组件,有自定义表列格式的需求,做完后顺手总结一下 后端返回的数据往往比较原始,比如状态是数值,而我们要给它转成中文并用不同颜色标记,这种场景很常见 代码如下(示例): 通过插槽v-slots实现 代码如下(示例): 在columns中

    2024年02月06日
    浏览(48)
  • vue3前端excel导出;组件表格,自定义表格导出;Vue3 + xlsx + xlsx-style

    当画面有自定义的表格或者样式过于复杂的表格时,导出功能可以由前端实现 1. 使用的插件 : sheet.js-xlsx 文档地址:https://docs.sheetjs.com/ 中文地址:https://geekdaxue.co/read/SheetJS-docs-zh/README.md xlsx-style:https://www.npmjs.com/package/xlsx-style 2. 安装引用 安装插件-vue3 引用插件 3. 组件表格

    2024年04月26日
    浏览(39)
  • 自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮

    自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮 注意:表头插槽拿到的column 和内容插槽拿到的内容不一致,header插槽的label对应el-table-column的label,prop对应header插槽的property 效果:

    2024年02月06日
    浏览(38)
  • 前端vue导出excel(标题加粗+表头自定义样式+表格边框+单元格自定义样式)

    接近过年,被一大堆excel报表烦死的我,遇到要求前端导出excel的后端,差点猝死的我拼命学习中,整理出这篇文章,希望看到这篇文章的你有所收获,也希望能收到大佬们的指点 之前用c#,.net弄过导出word,excel,可以点击查看.NET使用Aspose控件生成Word(可构建自定义表格)、

    2024年04月15日
    浏览(59)
  • vue3 + vite自定义封装vue + element-ui 表格组件,发布到npm包的全过程。

    当我们项目中用到的表格太多的话,就会导致我们的代码量一直增加,所以我们要封装一个公共得组件,通过传参引入来使用,下面这篇文章主要给大家介绍了关于vue3+vite自定义封装vue组件发布到npm包的相关资料,需要的朋友可以参考下。 提示我们要安装 create-vite@4.1.0 得依赖

    2024年02月02日
    浏览(67)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包