需求:

antd Table 只有 列固定 和表头固定,但是 我的需求是 行固定 前 三行固定。

实现步骤

方式一、表格固定行(rowClassName 实现)

思路是 :用position: sticky来实现

position: sticky是一个吸顶的效果,滚动时 会固定在顶部

然后借用top 属性 即可 这里注意 top 并不是固定的,因为

第一行距离顶部 0

第二行 就是 第一行的高度

第三行 就是 第一行和地二行 高度和

最后使用 rowClassName 实现 。判断 其 下标 给 不同的 类名即可。

代码如下:

jsx代码:

import React, { Component } from 'react';
import { Table } from 'antd';
import "../../assets/index.css";
class Index extends Component {constructor(props) {super(props)this.state = {columns: [{title: 'Name',dataIndex: 'name',width: 150,},{title: 'Age',dataIndex: 'age',width: 150,},{title: 'Address',dataIndex: 'address',},],data: []}}componentDidMount() {const data = [];for (let i = 0; i < 100; i++) {data.push({key: i,name: `Edward King ${i}`,age: 32,address: `London, Park Lane no. ${i}`,});}this.setState({data: data})}fixedTop = (record, index) => {let top = 0;if (index < 3) {let name = `fiexdTr${index}`return name;} else {return}}render() {const { data, columns } = this.state;return (<div><Table columns={columns} dataSource={data} pagination={{ pageSize: 50 }} scroll={{ y: 240 }} rowClassName={this.fixedTop} /></div>);}
}export default Index

css代码:

.fiexdTr0 {position: sticky;z-index: 100000;top: 0;background: red
}.fiexdTr1 {position: sticky;z-index: 100000;top: 54px;background: red
}.fiexdTr2 {position: sticky;z-index: 100000;top: 108px;background: red
}

这个是 一个我写的在线的例子 :

表格固定行(rowClassName 实现)-Ant Design Demo -在线案例

这个方法 其实有些 鸡肋,比如 要固定的行数 不固定,那就不适用了 。

方式二、表格固定行(rowClassName 实现、固定行数 为动态)

思路:

利用 js的方式 :

1.给Table 加一个 id

2.获取 .table body

3.获取 table body里的tr 合集

4. 就可以 根据 下标 判断 给其 加 样式了(用 cssText,当然 其它属性也可以 比如 setAttribute等等)

需要注意: 必须等表格 渲染完成 再设置 样式,如果 出不来 ,可以加个 定时器 setTimeOut。

不过 在 create-app里 不需要考虑这个 。只有案例 里需要考虑

jsx代码:

import React, { Component } from 'react';
import { Table } from 'antd';import "../../assets/index.css";
class Index extends Component {constructor(props) {super(props)this.state = {columns: [{title: 'Name',dataIndex: 'name',width: 150,},{title: 'Age',dataIndex: 'age',width: 150,},{title: 'Address',dataIndex: 'address',},],data: []}}componentDidMount() {const data = [];for (let i = 0; i < 100; i++) {data.push({key: i,name: `Edward King ${i}`,age: 32,address: `London, Park Lane no. ${i}`,});}this.setState({data: data})}fixedTop = (record, index) => {let table = document.getElementById("table1"); //获取 tabel domif (table) { //如果 table存在let tableBody = table.getElementsByClassName("ant-table-tbody")[0]; //获取 table的 bodylet trs = tableBody.getElementsByTagName("tr"); //获取 table body的 tr合集let top = 0; // top值if (index < 3) {if (index == 0) {top = 0;} else {top = index * 54;}if (trs[index]) { //设置样式trs[index].style.cssText = `position: sticky;z-index: 100000;background: red;top:${top}px;`}} else {return}}}render() {const { data, columns } = this.state;return (<div><Table id="table1" columns={columns} dataSource={data} pagination={{ pageSize: 50 }} scroll={{ y: 240 }}rowClassName={this.fixedTop} /></div>);}
}export default Index

这个是 一个我写的在线的例子 :

表格固定行(rowClassName 实现,固定行为动态)-Ant Design Demo-在线案例

其实这个也是有缺陷的,设置样式 按道理 只用一次就行,使用 rowClassName 就会运行很多次 。

这个 写法 其实 也有缺陷 就是 tr的高度 不固定 那就 没法实现了。所以 我又优化了一下,使用 js 动态获取 tr的高度(clientHeight 属性) 相加 即可。

  fixedTop = (record, index) => {let table = document.getElementById("table1"); //获取 tabel domif (table) { //如果 table存在let tableBody = table.getElementsByClassName("ant-table-tbody")[0]; //获取 table的 bodylet trs = tableBody.getElementsByTagName("tr"); //获取 table body的 tr合集let top = 0; // top值if (index < 3) {if (index == 0) {top = 0;} else {//  clientHeight 的值 = 元素内容(这里是高度)+上下paddingtop +=trs[index].clientHeight; // 动态 获取 tr的高度}if (trs[index]) { //设置样式trs[index].style.cssText = `position: sticky;z-index: 100000;background: red;top:${top}px;`}} else {return}}}

方式三、

思路:在 componentDidMount 里 调用 设置样式的函数 这样的话 性能可能会好一些。

方式二 用rowClassName 这个 会运行 很多次,有多少调条数据 运行 多少次 ,所以 需要优化一下。

下面这个 做了优化

import React, { Component } from 'react';
import { Table } from 'antd';
import "../../assets/index.css";
class Index extends Component {constructor(props) {super(props)this.state = {columns: [{title: 'Name',dataIndex: 'name',width: 150,},{title: 'Age',dataIndex: 'age',width: 150,},{title: 'Address',dataIndex: 'address',},],data: []}}componentDidMount() {const data = [];for (let i = 0; i < 100; i++) {data.push({key: i,name: `Edward King ${i}`,age: 32,address: `London, Park Lane no. ${i}`,});}this.setState({data: data}, () => {this.fixedTop(3);})}fixedTop = (rowNumber) => { // rowNumber必须是 number类型let table = document.getElementById("table1"); //获取 tabel domif (table) { //如果 table存在let tableBody = table.getElementsByClassName("ant-table-tbody")[0]; //获取 table的 bodylet trs = tableBody.getElementsByTagName("tr"); //获取 table body的 tr合集let top = 0; // top值for (var index = 0; index < rowNumber; index++) {if (index < rowNumber) {if (index == 0) {top = 0;} else {top = index * 54;}if (trs[index]) { //设置样式trs[index].style.cssText = `position: sticky;z-index: 100000;background: red;top:${top}px;`}} else {return}}}}render() {const { data, columns } = this.state;return (<div><Table id="table1" columns={columns} dataSource={data} pagination={{ pageSize: 50 }} scroll={{ y: 240 }}/></div>);}
}export default Index

这个 写法 其实 也有缺陷 就是 tr的高度 不固定 那就 没法实现了。所以 我又优化了一下,使用 js 动态获取 tr的高度(clientHeight 属性) 相加 即可。

fixedTop = (rowNumber) => { // rowNumber必须是 number类型let table = document.getElementById("table1"); //获取 tabel domif (table) { //如果 table存在let tableBody = table.getElementsByClassName("ant-table-tbody")[0]; //获取 table的 bodylet trs = tableBody.getElementsByTagName("tr"); //获取 table body的 tr合集let top = 0; // top值for (var index = 0; index < rowNumber; index++) {if (index < rowNumber) {if (index == 0) {top = 0;} else {//  clientHeight 的值 = 元素内容(这里是高度)+上下paddingtop +=trs[index].clientHeight; // 动态 获取 tr的高度}if (trs[index]) { //设置样式trs[index].style.cssText = `position: sticky;z-index: 100000;background: red;top:${top}px;`}} else {return}}}}

总结:

综上所述一共三种方案:

最好的是 方式三,其次是方式二、最后是方式一

方式一: 缺点 不灵活,如果固定行数 少 可以使用   优点 简单

方式二:缺点  性能略微不好(实际上可以不计,理论上 确实更费性能) 优点  灵活

方式三:缺点 基本没什么缺点  优点 灵活,性能好

所以我推荐 用第三种 。

我写出来只是 给大家一个思路。

思考拓展

如果 你的表格有分页,分页之后 依然需要 固定前三行 。理论上这三种都可以实现 。最好的依然是方式三 。

只不过 方式三 需要 你在 分页器 change事件 里 再调用这个方法 。

方式一、二则 不用 。

我的思路历程是这样的:

1.先实现 基础的 功能 所以我想到 方式一 的写法。

2. 实现了 基础功能 我有考虑其它 因素,比如 行数 并不固定 于是 想出了 动态 设置 样式,也就是方式二。

3. 既然行数 不固定,表格行 高度也可以不固定,所以 就想到 用js 获取 高度 。 也就是方式三的 写法。

我写这个 只是给大家一个思路,一个功能就是这样 不断的完善出来的,要善于思考,考虑需求考虑全面 ,各个方面要 考虑到(ps:当然我这个 也并不一定 是最好的方法,也不一定就那么全面,我只是 给大家个思路)。

antd Table 实现 表格行固定相关推荐

  1. element table 合计 第一行 固定列

    element table 合计 第一行 在这位大哥这里学来的, 但同时我这边的情况是: 固定高度, 第一列固定, 参数多, 因此, 这个方法不能够完全满足, 因此加入以下代码: 代码作用: 在每次获 ...

  2. Antd Table 点击行变换背景颜色 (Antd React)

    需求 实现的目标是,点击这一行,然后出现一个modal,这个modal可以拖拽,并且可以知道是点击哪一行出现的事件. 那么需要做的就是,点击这一行,然后其背景颜色变化. 实现 Antd Table有 ...

  3. antd table设置表格一个单元格的字体颜色_微软Office三件套,各有一个效率神器,全都知道的人不超过1%...

    我们都知道,微软Office三件套是指Word.Excel和Powerpoint,虽然微软Office套件还有诸如Outlook.Onenote等软件,但平时用得最多的,还是这三件套. 三件套其实构成 ...

  4. antd table设置表格一个单元格的字体颜色_开源 UI 库中,唯一同时实现了大表格虚拟化和树表格的 Table 组件

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

  5. antd table设置表格一个单元格的字体颜色_alireacttable:高性能 React 表格组件

    点击上方蓝字关注我们 简介 在前端开发中,表格一直都是最复杂的组件之一.表格不仅要支持丰富的操作(排序.过滤.搜索.分页.自定义列等),还要有非常好的性能以展示大量数据.很多组件库(例如 fusion ...

  6. html <table> 表格 表头固定 内容滚动 代码拿去就能用

    纯 html.css代码写的 table 表格 先来看下pc端的效果图 移动端的效果图,前面两张是静态图,第三张是gif动态图 (像素失真了 •︿• ) 公司的移动端项目,用的是react,页面需求是 ...

  7. 自定义antd table子表格的展开和收起,一键展开收起

    效果: 代码: import React from 'react'; import {Table} from 'antd'; const key = []; // 定义一个空的数组. export d ...

  8. Antd Table 可编辑表格

    antd Table 官方文档提及了 可编辑单元格.可编辑行,这里解决 可编辑表格 主要思路是将 antd Table 可编辑行 与 antd Form.List 相结合,将Table视为 Form. ...

  9. antd table 时间搜索_antd table按表格里的日期去排序操作

    表格内容 根据票据日期升序(这里是已经排序后的效果) 上代码 代码中data的内容如下 根据paper_date排序,因为目前这种格式不支持比较,需要先转换成时间戳 new Date(aTimeStr ...

最新文章

  1. java6特性_Java6的新特性
  2. asp.net ajax回调函数
  3. python列表字典的区别_python列表和字典区别
  4. 【更新】Essential Studio for Xamarin更新至2018 v4(二)
  5. 智能优化算法:原子搜索优化算法 -附代码
  6. “智慧城市”如火如荼 与“数字城市”又有何差别?
  7. 图的存储结构-十字链表
  8. php oop思想
  9. H5 页面36种漂亮的CSS3网页按钮Button样式
  10. 乌云曝光铁道部12306网站出现SQL漏洞
  11. FTP软件的安装及上传/下载方法
  12. python f检验 模型拟合度_Python 爬取北京二手房数据,分析北漂族买得起房吗? | 附完整源码...
  13. 计算机鼠标双击怎么,鼠标双击变成属性怎么办 鼠标双击变成属性解决办法【详解】...
  14. 程序人生 - 2020年杭州市积分入学实施办法权威解读
  15. 7.网络基础配置实验报告(2)
  16. ZCMU 1919 :kirito's 星爆气流斩 (多重背包问题)
  17. AUTOCAD——创建可编辑属性块
  18. 简易记账开发笔记之GridLayout
  19. java 折扣_java会员折扣
  20. scratch编写游戏:火柴人避开防守投篮

热门文章

  1. ppp协议与以太网协议的异同
  2. Android设置页面Preference出现红色下划线
  3. linux搭建服务器ppt,Linux服务器远程控制搭建.ppt
  4. 最近看的一本书和两部电影
  5. java 1.8 SteamAPI认识
  6. java 气泡聊天消息_Html,CSS 实现类似QQ的气泡聊天
  7. Rx Java 异步编程框架
  8. 大数据面试常见问题(五)——报表部分
  9. 【react基础】7、react获取文本框的值
  10. LTC6911 采用 MSOP 封装并具数字可编程增益的双匹配放大器