【问题标题】:React table filtering & responsiveReact 表过滤和响应式
【发布时间】:2018-02-19 07:08:39
【问题描述】:

我想使用 react 创建应该具有以下功能的表

  • 使用名称过滤器搜索过滤器
  • 使用状态的下拉过滤器
  • 单击列标题时升序和降序排序。
  • 使表格具有响应性

您可以假设以下数据 - var data = [{name: 'zz',state: 'ua'},{name: 'hhj',state: 'op'}]

我已经搜索了表功能的以下反应插件 -

在 github 上查看星星时,似乎 react griddle 更好,但 实现目标的最佳插件是什么

【问题讨论】:

  • 对屏幕尺寸的“响应式”是什么意思?什么是“使用状态的下拉过滤器”? FWIW,我过去使用 Ag-grid 取得了一些成功,但与 Redux 一起使用时,完成这项工作的是 React-virtualized
  • 两者都试一试,并根据您的实际情况进行评估?据我所知,我测试了很多表引擎并最终编写了自己的引擎;)
  • 你最后用的是哪一个?

标签: javascript reactjs


【解决方案1】:

我花了一天时间阅读所有可用的插件,这些插件有超过 100 颗星或分叉。过去几个月我一直在使用react-table,但它已经有几个月没有更新了,他的创建者在一个问题中写道,他计划在 6 个月内发布升级(对我们中的一些人来说太晚了)。

更难找到的要求是“使表格响应”。当时只有两个满足了这个要求:react-data-gridtabulator。这两个存储库都是在 2 年前创建的,有超过 1000 次提交,并且在上周进行了更新。

react-data-grid: 它没有完全响应,但至少它保持第一列固定,它有一个非常好的演示和专门为 React 编写的文档

tabulator:它的完全响应式带有一个名为响应式布局折叠列表的选项,但它的文档并不是专门为 React 编写的,因为它也可以与 Vue 和 Angular 一起使用。

TL:DR; 对于高级前端开发人员,我会推荐 tabulator,对于初级开发人员,我会推荐 react-data-grid,因为不要费力地创建表格

【讨论】:

【解决方案2】:

您是否尝试过研究 ReactTable?

ReactTable 表格具有内置功能,可在单击列标题时进行升序/降序排序。

就创建搜索过滤器而言,它也具有该功能。

您可能必须自己构建下拉过滤器,但我相信 ReactTable 应该为您提供一个基础,以完成您想要做的大部分事情。

不过,React-table 不提供响应式宽度。

我希望这会有所帮助!

【讨论】:

  • 您说“ReactTable 表对屏幕大小有响应”,但 demos 似乎只是在窄窗口上添加水平滚动条。你能指出一个响应式实现的例子吗?谢谢!
  • 我使用 react-super-responsive-table 和 react-table 来使使用 react-table 响应的表格变得非常容易。我使用了新的 Table、Thead、Tr、Td 和 Th 响应组件以及 react-table 没有问题。
  • 提供的链接无效,请更新您的答案
【解决方案3】:

您可以查看我基于 material-ui 库构建的表格实现。

https://github.com/mbrn/material-table

【讨论】:

    【解决方案4】:

    我尝试了很多解决方案,但是,我最简单的一个是 react-table。

    使用 npm - npm i react-table 安装 React-table。 参考:https://www.npmjs.com/package/react-table.

    React table 自定义过滤解决方案 - 这就是我使用 react-table 进行自定义过滤的方式。

    <ReactTable
              data={data}
              filterable
              defaultFilterMethod={(filter, row) =>
                String(row[filter.id]) === filter.value}
              columns={[
                {
                  Header: "Name",
                  columns: [
                    {
                      Header: "First Name",
                      accessor: "firstName",
                      filterMethod: (filter, row) =>
                        row[filter.id].startsWith(filter.value) &&
                        row[filter.id].endsWith(filter.value)
                    },
    
    {
                      Header: "Over 21",
                      accessor: "age",
                      id: "over",
                      Cell: ({ value }) => (value >= 21 ? "Yes" : "No"),
                      filterMethod: (filter, row) => {
                        if (filter.value === "all") {
                          return true;
                        }
                        if (filter.value === "true") {
                          return row[filter.id] >= 21;
                        }
                        return row[filter.id] < 21;
                      },
                      Filter: ({ filter, onChange }) =>
                        <select
                          onChange={event => onChange(event.target.value)}
                          style={{ width: "100%" }}
                          value={filter ? filter.value : "all"}
                        >
                          <option value="all">Show All</option>
                          <option value="true">Can Drink</option>
                          <option value="false">Can't Drink</option>
                        </select>
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2020-09-02
      • 2018-04-05
      • 2021-10-17
      相关资源
      最近更新 更多