antd-table自动定位、高亮目标行或列

✅正确打开列表花样玩法

项目要求

  1. 表格高亮目标行

  2. 表格目标行不在可视范围,自动定位到表格中间。

  3. 前端搜索定位,搜索列表匹配数据,高亮然后定位

  4. 多列排序,高亮当前排序列

技术栈

  vue + antd-vue

思路

  1. 高亮列表,自定义列表行的className,然后设置样式。使用table的rowClassName。

  2. 自动定位列表数据,列表数据渲染完后获取table距离页面顶部的距离、高亮行距离页面顶部距离、table的可视高度,用高亮行top - table的top - table的高度 / 2(除以2是为了将高亮行显示在table的中间,不减显示在第一行)。

  3. 输入关键字搜索,因为要高亮行,所以得重新渲染列表。首先遍历数据,匹配关键字数据设置标志位,高亮思路同上。

  4. 高亮当前排序列:其实也就是自定义渲染数据样式,tableChange的时候获取到当前被排序的column的dataIndex,存入全局。然后在渲染数据时判断是否为排序行数据,给其样式。

代码实现

  1. 渲染列表动态设置rowClassName

ra-table.mgt-16(
    rowKey="cityCode"
    :data-source="data" 
    :scroll="{y: scrollAreaHeight}" 
    :rowClassName="setRowClass"
     @change="tableChange")

// 设置当前城市高亮类 record为当前行数据
    setRowClass(record) {
    if (record.cityCode === this.cityCode)  return  'rowhighlight'
}  


// .css
    .rowhighlight {
        background: #F0F7FF;
    }

  2. 自动定位列表,scrollBy(x, y)表示相对现在的位置横向移动x,纵向移动y。也可以像我设置滚动的行为,我们希望它能平滑滚动,有一个过渡的效果,还可以设置滚动的时长。

// 定位高亮列
    setTableScroll() {
            this.$nextTick(() => {
                const tableEle = document.querySelector('.ant-table-body')
                const highlightRowEle = document.querySelector('.rowhighlight')
                const tableEleTop = tableEle && tableEle.getBoundingClientRect().top
                const tableEleClientHeight = tableEle && tableEle.getBoundingClientRect().height
                const highlightRowEleTop = highlightRowEle && highlightRowEle.getBoundingClientRect().top 
                const scroll = highlightRowEleTop - tableEleTop - tableEleClientHeight / 2
                tableEle.scrollBy({ top: scroll, behavior: 'smooth' })
            })
        },

  3. 搜索列表数据匹配高亮,实现方式同上,这里不再赘述。

  4. 高亮当前排序列,样式根据业务自行替换

a-table.mgt-16(
    rowKey="cityCode"
    :data-source="data" 
    :scroll="{y: scrollAreaHeight}" 
    :rowClassName="setRowClass"
    @change="tableChange")
        a-table-column(
            v-for="column in columns"
            :title="column.title"
            align="center"
            :sorter="column.sorter"
            :defaultSortOrder="column.defaultSortOrder"
            :key="column.dataIndex")
            template(slot-scope="text, record")
                div(
                    :style="getItemClass(record, column)" 
                    :title="record[column.dataIndex]") {{record[column.dataIndex]}}     

// fcvToColor 是根据当前值获取的颜色,可忽略
getItemClass(record, column) {
  // 判断当前行是否为排序行
  if (!column.sorter || column.dataIndex !== this.currentSorterKey) return
  const color = fcvToColor(record[column.dataIndex], column.key, 0)
  return {
    width: '40px',
    height: '22px',
    color: '#FFFFFF',
    background: color,
    borderRadius: '11px',
    margin: '0 auto',
  }
},

           

 效果预览

posted @ 2020-09-30 17:12  半暖半夏(。・ω・。)  阅读(2726)  评论(0编辑  收藏  举报