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. Linux 虚拟机安装vmware tools

    Linux Vmware tools安装步骤 1 在 vSphere Client 清单中,右键单击虚拟机,然后选择电源 > 开启.   2 单击控制台选项卡以确定客户机操作系统启动成功,并在需 ...

  2. 自动对比度的opencv实现

    在http://www.cnblogs.com/Imageshop/archive/2011/11/13/2247614.html 一文中,作者给出了“自动对比度”的实现方法,非常nice 实际实现过 ...

  3. 20145307陈俊达《网络对抗》Exp5 MSF基础应用

    20145307陈俊达<网络对抗>Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit就相当于是载具,各式各样的漏洞在 ...

  4. 20145329 《网络对抗技术》浏览器MS11_050安全漏洞攻击

    两台虚拟机: kali ip:192.168.96.130 windows xp sp3(包含IE7)ip:192.168.96.128 1.在kali终端中开启msfconsole. 2.进入漏洞模 ...

  5. C++ tinyXml直接解析XML字符串

    转载:http://www.cnblogs.com/1024Planet/p/4401929.html <?xml version=\"1.0\" encoding=\&qu ...

  6. 终于在nowcoder爆发了的懒惰

    题目 这类题目我实在忍不了了 Emma,随便做个nowcode比赛题吧,我在oj上也没找到 题意 求\(\sum_{L=1}^{n}\sum_{R=i}^{n}a[k](L<=k<=R)\ ...

  7. IntelliJ-IDEA和Git、GitHub、Gitlab的使用

    一.基本入门 1.IntelliJ-IDEA预装的版本控制介绍 我们来看IntelliJ-IDEA的版本控制设置区域 打开File>Settings>Version Control  可以 ...

  8. spring cloud kubernetes之serviceaccount permisson报错

    spring boot项目引用spring-cloud-starter-kubernetes <dependency> <groupId>org.springframework ...

  9. ASCII 、UTF-8、Unicode都是个啥啊,为啥会乱码啊?

    因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制1111 ...

  10. 使用 XPath 选择器

    在前面的内容中,我们掌握了一些 CSS 选择器和它们的使用方法,以及 rvest 包中用于提取网页内容的函数.一般来说,CSS 选择器足够满足绝大部分的 HTML 节点匹配的需要.但是,当需要根据某些 ...