elment-ui table组件 -- 远程筛选排序

基于 elment-ui table组件 开发,主要请求后台实现筛选 排序的功能。

需求

  • 排序 筛选 是对后台整个数据进行操作,而不是对当前页面的数据进行操作
  • 若是其关联的下一级页面,(eg:点击查看编辑时,再返回当前页面时,保留之前筛选,或排序条件),否则清空

先上一份源码, 直接使用官网的(修改了一小部分参数,可以忽略)

<el-table
:data="tableData"
style="width: 100%"
>
<el-table-column
prop="date"
label="日期"
sortable="custom"
min-width="180"
:filters="dateList"
>
</el-table-column>
<el-table-column
sortable="custom"
prop="name"
label="姓名"
min-width="180"
>
</el-table-column>
<el-table-column
prop="address"
label="地址"
min-width="200"
>
</el-table-column>
<el-table-column
prop="tag"
label="标签"
min-width="100"
:filters="flagList"
>
<template slot-scope="scope">
<el-tag
:type="scope.row.tag === '家' ? 'primary' : 'success'"
disable-transitions
>{{scope.row.tag}}</el-tag>
</template>
</el-table-column>
</el-table>

知识点

  • 筛选

    • 表头 (el-table

      • filter-change
      <el-table
      :data="tableData"
      style="width: 100%"
      @filter-change="handleFilter"
      >
    • 表格(el-table-column

      • 针对需要排序的列添加 :filters="Array[Object]" ,此处注意 Object 的格式必须为 {text: **, value: **} 键必须如此,暂时没有找到可以修改的api
        <el-table-column
        prop="date"
        label="日期"
        sortable="custom"
        min-width="180"
        :filters="dateList"
        >
        </el-table-column>
    • 设置默认值

      • filtered-value (作用在 el-table-column
      <el-table-column
      prop="tag"
      label="标签"
      min-width="100"
      :filters="flagList"
      :filtered-value="['公司']"
      >

      显示效果如下

  • 排序

    • 表头 (el-table)

      • sort-change
      <el-table
      :data="tableData"
      style="width: 100%"
      @filter-change="handleFilter"
      @sort-change="handleSort"
      >
  • tbody (el-table-column)
    • sortable 设置为 :sortable="'custom'"
    <el-table-column
    prop="date"
    label="日期"
    :sortable="'custom'"
    min-width="180"
    :filters="dateList"
    >
  • 设置默认值
    • default-sort 参数 { order: **, prop: **}, `prop指那一列,order 指升序还是倒序

显示效果如下

至此,初步需求完成,现在就是具体细化了

细化

  • 将未知的值都存入 vuex 中,便于全局控制

    • default-sort, filtered-value, filters

    default-sort, filtered-value 不能写死,因为是动态的请求参数,因而得注意了

    // component
    computed: mapState('elTable', [
    'flagList',
    'dateList',
    'filters',
    'sort'
    ])
    // vuex
    filters: [],
    sort: {
    order: '',
    prop: ''
    }
  • 方法,进行调用修改

    • 筛选过程中,无法很好定位到具体哪一列, 给当前列添加 column-key
    // vuex
    filtersDate: [],
    filtersTag: [],
    sort: {
    order: '',
    prop: ''
    }
    },
    mutations: {
    setFilters_date (state, data = []) {
    state.filtersDate = data
    },
    setFilters_tag (state, data = []) {
    state.filtersTag = data
    },
    setSort (state, data = {}) {
    state.sort = data
    }
    }
    // component
    methods: {
    ...mapMutations('elTable', [
    'setFilters_date',
    'setSort',
    'setFilters_tag'
    ]), handleFilter (filter) {
    // 拿到 key
    /**
    * 命名技巧罢了,只是关联
    */
    const key = Object.keys(filter)[0]
    this['setFilters_' + key](filter[key])
    },
    handleSort (column, prop, order) {
    console.log(column, prop, order)
    }
    },
    computed: mapState('elTable', [
    'flagList',
    'dateList',
    'filtersDate',
    'filtersFlag',
    'sort'
    ])

    上面主要是如何将几者之间进行关联罢了

清除

即要清除当前页面的数据,同时还要清除 vuex 里存的数据

  • clearFilter, clearSort
// vuex
clear (state) {
state.filtersDate = []
state.filtersTag = []
state.sort = {
order: '',
prop: ''
}
}
// component
clearAll () {
this.$refs.tb.clearFilter()
this.$refs.tb.clearSort()
this.clear()
}

  • 是否是关联的页面
    created () {
    // 此处做判断,是否是其关联的页面,不是清除,是就不清除
    if (!isPage) return
    this.clearAll()
    }

总结

  • 可能还有些不完善,但是已经可以实现上述需求了
  • 有个问题, 筛选时,不点击筛选或重置,是无法在vuex中缓存,其实也很合理,vuex里存请求的数据,没点击也就没必要存储了

2019-03-18补充

由于设置 filtered-value时,有默认值,便会导致有时使用 clearFilter 方法时无法清除该值,看了下源码,感觉需要将筛选组件激活下才能使用,而一进页面是没有的,特别页面间跳转,再回来清除,基本没指望了。

  • 思路

    想了许久,既然方法不够用,那就让该组件重置即可,要不就刷新

    • 刷新 window.location.reload() 但是体验实在是不敢恭维,毕竟也面刷新,走的接口多,其次视觉效果也不是很好
    • 组件重置,这个才是我现在研究的对象
      • vue自带组件重置功能 $forceUpdate ,使用了却没有效果,因为不对子组件进行操作,所以排除
      • 人为重置,v-if 可以让组件重新渲染,在点击清除时v-if=flase 再给个几秒延迟设置v-if=true 便可以实现

      此处需要注意,使用$nextTick时,时间依旧不够,若是涉及到数据请求,放在数据请求回来时设置 v-if=true会更好

虽然这些方法还不是最好的,但是还需要一步步继续前行了

elment-ui table组件 -- 远程筛选排序的更多相关文章

  1. Element UI table组件源码分析

    本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...

  2. element ui table组件自定义合计栏,后台给的数据

    合计的数据是后台传的,所以用table组件自定义一行用来合计 <el-table border fit v-loading.body="listLoading" elemen ...

  3. vue+element ui table组件封装,使用render渲染

    后台管理经常会用到表格,一开始封装了一个常用的功能性表格,点击这里: 后来由于需求增加,在表格中还会用到switch,select,input等多种组件,每次都要在html中增加<el-tabl ...

  4. 普通element ui table组件的使用

    1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...

  5. element ui table表头动态筛选条件

    本文主要实现:根据el-table表格数据自动生成表头筛选条件的方法,可根据表格数据动态调整. el-table表格的表头增加筛选功能,大家平时都是怎么实现的呢?先看看官方文档的例子: 1 <t ...

  6. vue 基于elment UI tree 组件实现带引导、提示线

    实现样式 准备工作,先实现 树状组件的基本样式 <span style="height:500px; display:block; overflow-y:auto;" cla ...

  7. element UI table 过滤 筛选问题

    一.问提描述    使用elementUI table 官方筛选案例,发现筛选不是服务器端筛选,而是浏览器端对每一页进行单独筛选. 如何在服务器端筛选? 二.查询Element UI 官网table组 ...

  8. 开源 UI 库中,唯一同时实现了大表格虚拟化和树表格的 Table 组件

    背景 有这样一个需求,一位 React Suite(以下简称 rsuite)的用户,他需要一个 Table 组件能够像 Jira Portfolio 一样,支持树形数据,同时需要支持大数据渲染. 截止 ...

  9. 09 - Vue3 UI Framework - Table 组件

    接下来做个自定义的表格组件,即 table 组件 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 基于原生 table 标签的强语义 允许用户自定义表头.表体 可选是否具有边框 ...

随机推荐

  1. 03: KindEditor (HTML可视化编辑器)

    目录: 1.1 kindEditor常用配置参数 1.2 kindEditor下载与文件说明 1.3 kindEditor实现上传图片.文件.及文件空间管理 1.1 kindEditor常用配置参数返 ...

  2. 20165310java_blog_week6

    2165310 <Java程序设计>第6周学习总结 教材学习内容总结 String 构造 String str=new String() String (char a[]) String ...

  3. Python3基础 函数 可变参数,将传进来的参数转成列表

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. BZOJ 4552: [Tjoi2016&Heoi2016]排序 线段树 二分

    目录 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 update 10.6 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 /* //fang zhi ...

  5. win7下把电脑设置成wlan热

    有很多公司没有无线网,只有自己的电脑可以上网,现在设置热点,可以手机上网 步骤: 1.看自己的网卡是否支持承载网络,如果不支持,本法就不适用 在CMD里用    netsh wlan show dri ...

  6. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解

    题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...

  7. redis linux版本自定义安装目录、注册服务、自启动设置、一台计算机安装多个redis

    自定义安装目录并安装 1.mkdir /usr/local/redis 2.下载redis到 /usr/local/src/,解压,进入解压后的目录 3.安装到指定目录 make PREFIX=/us ...

  8. icpc 2017北京 J题 Pangu and Stones 区间DP

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  9. SPA (单页应用程序)

    单页Web应用 编辑 单页Web应用(single page web application,SPA),就是只有一张Web页面的应用.单页应用程序 (SPA) 是加载单个HTML 页面并在用户与应用程 ...

  10. UVa 11235 频繁出现的数值

    https://vjudge.net/problem/UVA-11235 题意: 给出一个非降序排列的整数数组a1,a2,...,an,你的任务是对于一系列询问(i,j),回答ai,ai+1,...a ...