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. c++性能之对象与指针性能比较、以及java与c++性能对比实测

    为了更加直观的比较,好吧,我们选择以对象的初始化并add到list为例子. 首先,定义object如下: #include <string> #pragma once using name ...

  2. 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解

    20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...

  3. 如何让VS2012编写的程序在XP下运行

    Win32主程序需要以下设置 第一步:在工程属性General设置 第二步:在C/C++ Code Generation 设置 第三步:SubSystem 和  Minimum Required Ve ...

  4. 客户端向服务端请求连接是出现"ssh : Connection refused"原因有哪些

    注意:服务端的sshd服务已经正常开启 (可以正常进行连接) 1.在服务端负载比较高的情况下客户端请求连接时会出现连接被拒绝的情况

  5. User-Defined Table Types 用户自定义表类型

    Location 数据库--可编程性--类型--用户定义表类型 select one database--> programmability-->types-->user--defi ...

  6. 项目中同一个dll的x86和x64同时引用

    <ItemGroup Condition=" '$(Platform)' == 'x86' "> <Reference Include="System. ...

  7. OI无关--关于侧边栏

    自己在比较闲的时候学了一点html和js,大概能写一些比较简单的东西了,于是就动起了侧边栏的念头. 如果能在博客里加一个题目快速跳转也很兹磁啊. 首先要选择题目,oj的名字肯定是不能直接输入,因为还有 ...

  8. 论文笔记——DenseNet

    <Densely Connected Convolutional Networks>阅读笔记 代码地址:https://github.com/liuzhuang13/DenseNet 首先 ...

  9. axis2框架用wsdl文件生成的服务端MessageReceiveInOut文件注意事项

    在用axis2生成服务端文件和客户端文件,当客户端文件调用服务端文件时,都是通过wsdl文件生成的 配置文件进行相互的调用. 在一开始做开发测试的时候,通过soapUI进行调用接口的时候,可以调用成功 ...

  10. 《C语言程序设计》指针篇<二>

    通过指针引用多维数组 如何理解二维数组元素的地址? 要知道,这本书用了整整两页的内容来讲解这方面的知识,从这里足以看出来理解通过指针来引用二维数组是一件比较麻烦的事情,但是我认为理解并不难. 什么是二 ...