前端表格实现搜索筛选

前情提要

使用elementuiel-tableel-pagination 搭建分页表格数据,想要实现不同的搜索功能,跟后端一样,类似下图显示:

image.png

搜索区域可以根据不同的搜索条件进行匹配,条件:
= | > | >= |<= | 是否为空(IS_UNDEF) | like | left_like | right_like | in | 日期范围(DBT)
搜索的字段类型: 日期、数字、字符串

实现方法

思考:
主要思考难点是怎么让数据保持存在且不显示?
可以利用数据的 双向绑定属性 实现,这里为 _hide,为 true 则不显示,反之,则显示。

匹配的代码大概如下:

// 前端搜索(简版)
handleDataSearch(queryParams) {
    // 表单列表-查询字段
    const conditions = [{......}]
    const subData = this.data
    if (subData && subData.length < 1) return
    for (let i = 0; i < subData.length; i++) {
      this.$set(subData[i], '_hide', false)
    }
    conditions.forEach(cond => {
      if (
        !cond.hasOwnProperty('searchType') ||
        cond.searchType.indexOf('precise') != -1
      ) {
        const { ct, qt, name, colPrefix, option } = cond
        const op = this.getQT(qt) // 获取不同的条件值
        const path = 'Q$' + colPrefix + name + '$' + op
        let val = queryParams.fieldLogic[path]
        if (ct == 'number_range') { // 数字范围,两个分开匹配
          const lVal =
            queryParams.fieldLogic[`Q$${colPrefix + name}$GE`]
          const rVal =
            queryParams.fieldLogic[`Q$${colPrefix + name}$LE`]
          this.doMatch(subData, lVal, 'GE', name, cond)
          this.doMatch(subData, rVal, 'LE', name, cond)
        } else {
          this.doMatch(subData, val, op, name, cond)
        }
      }
    })
},
// 用 正则表达式 进行匹配
doMatch(arr, value, op, code, field) {
  const isDef = v => {
    return v !== undefined && v !== null && v !== ''
  }
  if (!isDef(value)) return // 没有值输入时,不匹配
  const { ct, ty } = field
  if (ct == 'onetext' && ['为空', '不为空'].indexOf(value) > -1) {
    op = 'IS_UNDEF'
  } else if (
    (['number'].indexOf(ct) > -1 || ty == 'number') &&
    typeof value === 'string' &&
    value.length
  ) {
    value = +value
  } else if (op == 'IN' && value instanceof Array) {
    value = value.join(',')
  } else if (op === 'DBT' && typeof value === 'string') {
    value = value.split(',')
  }
  for (let i = 0; i < arr.length; i++) {
    let v = arr[i][code]
    if (
      op !== 'IS_UNDEF' &&
      (['number'].indexOf(ct) > -1 ||
        ty == 'number') &&
      typeof v === 'string' &&
      v.length
    ) {
      v = +v
    }
    let _hide = false
    // 没有定义值时统一不符合筛选标准,除非是 '为空' || '!=' 判断
    switch (op) {
      case 'SE': // '='
      case 'S': // '='
        _hide = !(v === value)
        break
      case 'NE': // '!='
        _hide = v === value
        break
      case 'DS':
      case 'SLL': // 'left_like'
        _hide = v ? !new RegExp('^' + value).test(v) : true
        break
      case 'SLR': // 'right_like'
        _hide = v ? !new RegExp(value + '$').test(v) : true
        break
      case 'DYIN':
      case 'IN':
        _hide = v ? !new RegExp(v).test(value) : true
        break
      case 'DGR':
      case 'GT': // '>'
        _hide = !(v > value)
        if (
          ('date' == ct || 'DGR' == op) &&
          !_hide &&
          v.length > value.length
        ) {
          _hide = !(v.slice(0, value.length) > value) // 日期长度不一致时
        }
        break
      case 'DLE':
      case 'LT': // '<'
        _hide = isDef(v) ? !(v < value) : true
        break
      case 'DL':
      case 'GE': // '>='
        _hide = isDef(v) ? !(v >= value) : true
        break
      case 'DG':
      case 'LE': // '<='
        _hide = isDef(v) ? !(v <= value) : true
        if (('date' == ct || 'DG' == op) && _hide) {
          _hide = !new RegExp('^' + value).test(v) // 日期长度不一致时
        }
        break
      case 'DBT': // 日期范围
        if (value[0]) {
          // '>='
          _hide = !(v >= value[0])
        }
        if (value[1] && !_hide) {
          // '<='
          _hide = v ? !(v <= value[1]) : true
          if (_hide) {
            _hide = !new RegExp('^' + value[1]).test(v)
          }
        }
        break
      case 'IS_UNDEF': // ['为空', '不为空']
        _hide = value == '为空' ? isDef(v) : !isDef(v)
        break
      case 'SL': // 'like'
      default:
        _hide = v ? !new RegExp(value).test(v) : true
        break
    }
    // 没有隐藏(显示的)的 -> 判断是否隐藏
    if (!arr[i]._hide && _hide) {
      this.$set(arr[i], '_hide', _hide)
    }
  }
},

注明:本文仅用于学习记录,如有侵权,请联系删除!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359