Antd table无权限时,部分列增加蒙层

文章介绍了两种方法来处理在无权限时,表格中部分列不可见但需要显示列头的情况。一种是通过JavaScript获取列宽度并创建遮罩层,另一种是使用React和AntDesignTable组件,将需要遮盖的列合并行和列,以达到视觉上的隐藏效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现有一个,无权限时,表格只能查看部分列数据,但是不可查看部分仍要显示列,只是不能查看列中数据,实际效果如图:

在这里插入图片描述
在这里插入图片描述

实现思路一:(此方法比较笨~)
1. 获取不可查看列的宽度 
  const els = document.querySelectorAll('.ant-table-header colgroup col');
2. 获取table的body滚动高度
  const tbody = document.querySelectorAll('.ant-table-tbody')[0];
3. 将蒙层宽度设置为不可查看的总列宽,高度设置为tbody的滚动高度,遮住表格,这里总列个数通过传入的值获取,比如需要遮住第一第二两列,传入rangeCol=[0,1],
4. 需要遮住第二第三第四三列,则传入rangeCol=[1,3]
总代码
// 遮罩层
function Mask(props) {
    const { rangeCol } = props;
    const els = document.querySelectorAll('.ant-table-header colgroup col');
    const tbody = document.querySelectorAll('.ant-table-tbody')[0];
    let width = 0;
    if (els.length) {
      for (let i = rangeCol[0]; i <= rangeCol[1]; i++) {
        width += els[i].clientWidth;
      }
    }
    return (
      <div
        className={`mask`}
        style={{ width: `${width}px`, height: `${tbody.scrollHeight}px` }}
      >
        <div>开通权限可查看</div>
      </div>
    );
  }
// css部分
  .mask {
      position: absolute;
      top: 0;
      z-index: 9999;
      background-color: white;
      margin-left: -16px;
      box-shadow: 0px 0px 4px 0px rgba(11, 20, 40, 1);
      div {
        position: sticky;
        width: 100%;
        top: 100px;
        text-align: center;
        font-size: 20px;
      }
    }
table中配置
import Mask from '@/components/Mask'

const columns = [
    {
      title: '列1',
      dataIndex: 'column1',
      width: 320, 
      render: (_, record, index) => {
      if (index === 0) { // 从第一行开始
	      return <Mask rangeCol=[0, 1] /> // 代表第一列和第二列没有查看权限
	      }
		}
    },
    {
      title: '列2',
      width: 240,
      dataIndex: 'column2', 
    },
    {
      title: '列3',
      width: 240,
      render: (_, record, index) => <div>3数据可查看</div>,,
    },
  ];
实现思路二:(推荐~)
1. 将需要添加蒙层的第一列合并行、列占满蒙层
2. 将蒙层中除第一列外行、列均设置为0
总代码
import React, { useEffect } from 'react';
import styles from './index.less';
import { Table } from 'antd';

// 宽度和表格列宽度一致
const defaultBgPlace = [{ width: 400 }, { width: 400 }];
export default function index() {
  // 背景模糊占位
  const [bgPlace, setBgPlace] = React.useState(defaultBgPlace);

  const columns = [
    {
      title: '姓名',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: '年龄',
      dataIndex: 'age',
      key: 'age',
      width: 400,
      onCell: (_, index) => ({
        colSpan: index === 0 ? 2 : 0,
        rowSpan: dataSource.length,
      }),
      render: () => (
        <div className="mask">
          <div className="bg-place-wrap">
            {bgPlace?.map((item, index) => (
              <span
                key={index}
                className="bg-place"
                style={{ width: `${item.width}px` }}
              >
                xxx{index}
              </span>
            ))}
          </div>
          <div className="view">点击查看</div>
        </div>
      ),
    },
    {
      title: '地址',
      dataIndex: 'address',
      key: 'address',
      width: 400,
      onCell: (_, index) => ({
        colSpan: 0,
        rowSpan: 0,
      }),
    },
  ];
  const dataSource = [
    {
      key: '1',
      name: '小明',
      age: 18,
      address: '北京市朝阳区芍药居',
    },
    {
      key: '2',
      name: '小张',
      age: 18,
      address: '北京市朝阳区芍药居2',
    },
  ];

  useEffect(() => {
    // 循环生成对应行数蒙层数据
    let data: any = [];
    dataSource?.forEach((item) => {
      data.push(...bgPlace);
    });
    console.log(data);
    setBgPlace(data);
  }, []);

  return (
    <div className={styles.container}>
      <Table columns={columns} dataSource={dataSource} pagination={false} />
    </div>
  );
} 
// css
.container {
  :global {
    .mask {
      // 为了宽高占满cell
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      .bg-place-wrap {
        .bg-place {
          // 处理背景模糊
          display: inline-block;
          min-height: 55px;
          filter: blur(4px);
          padding: 10px 20px;
          box-sizing: border-box;
        }
      }
      .view {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        color: blue;
        cursor: pointer;
      }
    }
  }
} 
### 实现 Ant Design Table 组件中的选中功能 为了实现在 Ant Design 的 `Table` 组件中选中某一,可以利用 `column` 配置项来设置特定的行为和样式。通常情况下,Ant Design 并不直接提供针对单个的选择机制,但是可以通过组合其他特性间接实现这一需求。 #### 使用 Checkbox 来模拟选择效果 一种常见的方式是在目标内放置复选框 (`Checkbox`) 或者开关按钮 (`Switch`) 等交互控件,让用户能够点击这些控件来进行所谓的“选择”。下面是一个简单的例子展示如何通过配置 `columns` 属性,在指定的一里加入可操作的 `Checkbox`: ```jsx import React from 'react'; import { Table, Checkbox } from 'antd'; const columns = [ { title: 'Name', dataIndex: 'name', key: 'name' }, { title: 'Action', // 这一为要实现选中的 render: (_, record) => ( <div> <Checkbox onChange={() => handleSelect(record)}>Select</Checkbox> {/* 添加此行 */} </div> ) } ]; function App() { const [selectedRows, setSelectedRows] = React.useState([]); function handleSelect(row){ let newSelectedRows; if(selectedRows.some(r=>r.key===row.key)){ newSelectedRows = selectedRows.filter(r=>r.key!==row.key); }else{ newSelectedRows = [...selectedRows,row]; } setSelectedRows(newSelectedRows); } return ( <> <p>{JSON.stringify(selectedRows)}</p> <Table dataSource={data} columns={columns} /> </> ); } ``` 上述代码片段展示了如何向表格添加带有 `Checkbox` 控制器的新,并且当用户勾选/取消勾选时更新状态表 `selectedRows`[^1]。 对于更复杂的场景,比如需要高亮显示被选中的单元格或者整行,则可能还需要借助于 `rowClassName` 和 CSS 类名配合完成视觉上的反馈[^4]。 另外值得注意的是,如果希望整个应用范围内都支持这种行为模式的话,考虑封装成更高阶组件(HOC),以便重复使用相同的逻辑而无需每次都手动编写相同的部分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值