首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在运行时显示/隐藏列?

在运行时显示/隐藏列是一个非常常见的需求,通常在用户与表单交互时实现这个功能。有许多方法可以使用JavaScript来处理这个问题,下面给出一种使用AJAX和React实现的简单方法。

实现思路

首先,我们需要确保HTML表格中的第一列被隐藏。然后,我们使用一个隐藏列,当用户滚动到特定位置时显示该列。要隐藏列,我们可以在HTML中添加一个class属性为"hidden-column"并将其设置为True。要显示列,我们可以通过React组件将该class属性设置为False。

在React 组件中,我们可以使用useState来存储需要显示的列位置。当用户滚动到特定位置时,我们可以将该位置的class属性设置为“hidden-column”并触发一个函数来隐藏相应的列。最后,我们可以将已隐藏的列的位置值存储到useState 属性中,以便在需要时使用它来还原隐藏的列。

实现代码

代码语言:bash
复制
import React, { useState, useEffect } from "react";

const hideColumn = (state, column) => {
    state[column] = false;
  };

const showColumn = (state, column) => {
    state[column] = true;
  };

const Table({ data = [], columnNames = [] }) {
  const [tableColumns, setTableColumns] = useState(
    columnNames.map((name) => [name, data[0].includes(name)])
  );

  const [showColumnAt, setShowColumnAt] = useState(NaN);

  useEffect(() => {
    const currentColumn = columnNames.indexOf(showColumnAt);
    const hiddenColumns =
      columnNames.every((name) => data[0].indexOf(name) === -1) ? {} : {};
    data.forEach((row) => {
      if (showColumnAt && data[0].indexOf(showColumnAt)) {
        hiddenColumns[name] = false;
      }
      setTableColumns(tableColumns.map((col) => [col[0], col[1] + row]));
    });

    if (!currentColumn) {
      setTableColumns(tableColumns.map((col) => [col[0], true]));
    } else {
      Object.entries(displayColumns).forEach(([name, value]) => {
        if (col[1] === false) {
          setTableColumns(tableColumns.map((col) => [
            col[0],
            hiddenColumns[name],
          ]));
        }
        if (displayColumns[name]) {
          setTableColumns((prevColumns) => [
            ...prevColumns,
            [col[0], ...displayColumns[name]],
          ]);
        }
      });
    }
  }, [
    data,
    columnNames,
    setTableColumns,
    setShowColumnAt,
    displayColumns,
  ]);

  const onShowColumnClick = (event, column) => {
    event.preventDefault();
    if (column === showColumnAt) {
      setShowColumnAt(null);
    } else {
      showColumnAt = column;
    }
  };

  const renderHiddenColumn = () => (
    <th
      onClick={(event) => onShowColumnClick(event, showColumnAt)}
      className={showColumnAt === null ? "hidden-column" : ""}
    >
      {`隐藏${showColumnAt}`}
    </th>
  );

  return (
   <table>
     <tbody>
        {tableColumns.map((col, index) => (
          <tr key={index}>
            <td align="left" onClick={onShowColumnClick}>
              {col[0]}
            </td>

            {/* Hidden column */}
            {col[1] ? (
              col[1] === false ? null : renderHiddenColumn()
            ) : (
              col[1] && <th onClick={event => hiddenColumns[col[0]] = !hiddenColumns[col[0]]} />
            )}
          </tr>
        ))}
      </tbody>
    </table>
  );
}

// ...

在上面的代码中,我们将所有的数据和方法都封装在了Table组件中。这个组件接收两个参数:datacolumnNamesdata是一个数组,它包含表格中的所有行。columnNames是一个数组,它包含与每行对应的所有列名。

在组件开始运行时,我们首先根据datacolumnNames计算出所有应该显示的列。然后,我们使用这些信息来初始化JavaScript对象displayColumnstableColumns,它们分别记录了应该显示的列以及每个列应该显示的值。

当用户与表格交互时,我们会根据用户的操作处理showColumnAthiddenColumns的状态。然后,我们会更新组件的状态并将更新后的tableColumns返回给父组件以便于渲染表格。

在渲染表格的代码中,我们将隐藏列渲染为一个小图标,当用户单击它时,它会将当前列设置为不可见或被隐藏的行设置为可见。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Java如何在运行时识别类型信息?

    在Java中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为RTTI,英文全称为Run-Time Type Identification,即运行时类型识别,有没有一点...运行时类型识别主要由Class类实现。 01 Class类 在Java中,我们常用“class”(首字母为小写的c)关键字来定义一个类,说这个类是对某一类对象的抽象。...这也就是说,Java能够在运行时自动识别类型的信息,它不会因为wanger的引用类型是Author而丢失wanger真正的类型信息(Writer)。Java是怎么做到这一点呢?...这也就是说,每个对象在运行时都会有对应的Class对象,这个Class对象包含了这个对象的类型信息。因此,我们能够通过Class对象知道某个对象“真正”的类型,并不会因为向上转型而丢失。...但写作的好处就在于此,在向读者解释“Java如何在运行时识别类型信息”的过程中,我的思路逐渐地清晰了起来——这真是一个自我提升的好办法!

    1K20

    如何在运行时保护容器化工作负载

    如何在运行时保护容器化工作负载 翻译自 How to Protect Containerized Workloads at Runtime 。...运行时安全性:预防优先 运行时安全性可能听起来像是一种超级特定的要求或方法,但 Bhatt 和其他专家指出,如果做得好,运行时安全的整体方法可以增强整个环境和组织的安全态势。...运行时安全性还应该理想地保护应用程序运行所需的环境、存储、网络和相关库。 运行时安全的 SaaS 解决方案 用更通俗的术语来说:运行时安全性意味着保护现代软件应用程序和环境中常见的所有东西。...以下是保护运行时要遵循的四个原则。 正确执行运行时安全性的 4 个关键 1.保护您的应用程序免受已知威胁的侵害。...这是预防优先思维模式的核心,侧重于引入工具持续检查的可靠威胁源 - 不仅在构建和部署期间,而且在运行时也是如此。

    11910

    WPF --- 如何以Binding方式隐藏DataGrid

    引言 如题,如何以Binding的方式动态隐藏DataGrid?...预想方案 像这样: 先在ViewModel创建数据源 People 和控制隐藏的 IsVisibility,这里直接以 MainWindow 为 DataContext public partial...NotImplementedException(); } } 然后再界面绑定 IsVisibility,且使用转化器转化为Visibility,最后增加一个 CheckBox 控制是否显示...,取消勾选后,隐藏年龄: 小结 本篇文章中,首先探索了 DataGridTextColumn 为什么不在可视化树结构内,是因为「所有继承自 Visual 或 UIElement(UI 元素的更高级别抽象...其次探索如何通过曲线救国,实现以 Binding 的方式实现隐藏DataGridTextColumn,我们借助了一个核心抽象类 System.Windows.Freezable。

    43110

    (vue+element-ui)动态设置tabel显示隐藏

    不得不说,百度很强大,只要搜索饿了么怎么动态设置会得到很多答案; 1、v-show(不生效):v-show直接绑定,得到的结果很意外,哈哈,不起作用,饿了么对v-show不感冒; 2、v-if():此方法确实可以控制显示隐藏...='true'  align="center">  注意看结构;这里只采用了prop传值的写法;也就是说tabel展示出来的数据是只可读的不可以操作某一里面的某一个字段...; 若只是可读,那么可以使用这个方法控制动态展示;v-if绑定动态值; >>b:  element组件 el-table-column (可以点击tabel表格的某一展示值,做一些事情,如:弹窗,跳转等... 注意看结构:这里多了 template  标签,通过包裹可以来做一些事情,任你YY去行动; 重点注意  key   1.若不加key 那么你点击动态展示的时候布局会乱...,或者导致报错; 2.加了key之后ok解决; 备注:加 key 是百度来的,有篇文章加的是 :key=Math.random();      这样是有bug存在,设置动态的时候,列表的表头跳闪厉害;

    10.3K40

    解决bootstrap-table-fixed-columns.js显示隐藏按钮切换表格不对齐

    data-show-columns="true" data-fixed-columns="true" data-fixed-number="3"> 含有data-show-columns="true"属性时会在右边显示可以切换的按钮...结合bootstrap-table-fixed-columns.js插件使用时会出现不对齐的问题 查看Dom结构发现点击一次具体切换按钮时会增加一个class 为fixed-table-header-columns...的html片段,我们只需保留最后一个,解决方法 1、先删除多余的html 2、执行表格对齐函数 为了使排序的图标正常显示,需要在onSort的事件中执行能使图标正常显示的代码(注意如果要使固定的列有排序的功能请看我另一篇博客...#tableTest1').bootstrapTable('resetView'); fixleftwidth() }); }); //格式化显示

    5.6K40
    领券