首页
学习
活动
专区
工具
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返回给父组件以便于渲染表格。

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

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

相关·内容

  • ViewStub和Gone区别[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。 也就是说,会耗费内存等资源。 推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。 可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候, 或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。 这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。 但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。 (1.)android.view.ViewStub特点: 1.ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后, 就不会够再通过ViewStub来控制它了。 2.ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。 基于以上的特点,那么可以考虑使用ViewStub的情况有: 1.在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。 因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。 所以当需要在运行时不止一次的显示和隐藏某个布局, 那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。 2.想要控制显示与隐藏的是一个布局文件,而非某个View。 因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。

    03

    ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案

    在葡萄城ActiveReports报表中可以通过矩阵控件非常方便的实现交叉报表,同时还可以设置数据的分组、排序、过滤、小计、合计等操作,可以满足您报表的智能数据分析等需求。在矩阵控件中组的行数和列数由每个行分组和列分组中的唯一值的个数确定。同时,您可以按行组和列组中的多个字段或表达式对数据进行分组。在运行时,当组合报表数据和数据区域时,随着为列组添加列和为行组添加行,矩阵将在页面上水平和垂直增长。 在矩阵控件中,也可以包括最初隐藏详细信息数据的明细切换,然后用户便可单击该切换以根据需要显示更多或更少的详细信

    05
    领券