百科.dev
全部条目AI 编程趋势榜开源项目技术资讯提交条目
登录
< 返回工具列表
R

reactable

> 编程语言
开源

React 中的快速、灵活且简单的数据表

1.5K stars0 点赞1 次浏览
访问官网GitHub

工具介绍

React 中的快速、灵活且简单的数据表

Reactable

Fast, flexible, and simple data tables in React.

Reactable allows you to display tabular data client-side, and provides sorting, filtering, and pagination over that data. It uses the power of React.js to do all this very, very quickly, and provides an API that makes simple things easy, while trying to get out of your way as much as possible if you want to do something complicated or unconventional.

This project is currently alpha-stage, which means the API may or may not be unstable and there might be hidden bugs lurking around any corner. I'll try to tag any releases with breaking changes, however, and the more people who use this the faster we can get to 1.0!

Note: As of version 0.12.0 Reactable will only continue to support React 0.14 and higher.

Table of Contents

  • Installation
  • Usage
    • Further Customization
    • Even More Customization
    • Additional node types
    • Customizing Columns
    • Preventing escaping of HTML
    • Pagination
    • Sorting
    • Filtering
    • Empty Data Sets
    • Events

Installation

Using Bower

bower install [--save] reactable

Using NPM

npm install [--save] reactable

Or, you can just download the raw file here.

That file can be used either as an AMD module, as a CommonJS module in Node, or, if neither are supported, will register the Reactable object as a property of the window object.

Reactable also exposes a set of CommonJS modules for piece-by-piece use with Node, Webpack, Browserify, etc. These modules are located in the lib folder at the root of this repositiory.

Keep in mind that Reactable depends on the latest version of React (0.14), which can be downloaded here

Usage

The simplest example:

var Table = Reactable.Table;
ReactDOM.render(
    <Table className="table" data={[
        { Name: 'Griffin Smith', Age: 18 },
        { Age: 23,  Name: 'Lee Salminen' },
        { Age: 28, Position: 'Developer' },
    ]} />,
    document.getElementById('table')
);

While pretty basic, this example demonstrates a couple things:

  • Columns in the data array can be in any order, and you can omit any you like
  • Regular React DOM attributes such as className will pass-through to the rendered <table>
  • Data values can be any type with a toString() method

Further Customization

You can also manually build up your rows using Reactable.Tr nested in a table, also using the data prop, but this time containing only one javascript object. This approach can be freely combined with the data property on the <Table>, and is useful if you want to specify per-row attributes such as classes, like so:

var Table = Reactable.Table,
    Tr = Reactable.Tr;

ReactDOM.render(
    <Table className="table" data={[
        { name: 'Row one', content: 'These are regular data rows' },
        { name: 'Row two', content: 'They work like above' },
    ]} >
        <Tr className="special-row"
            data={{ name: 'Other Row' , content: 'This is a different row' }} />
    </Table>,
    document.getElementById('table')
);

Even More Customization

If you want to customize the rendering of individual columns, you can go a level deeper by embedding a Reactable.Td inside your Reactable.Tr. These have the required column property, and an optional value property if you want to customize the data that's used for sorting and filtering - if the latter isn't specified, the data used will default to the Td's children.

Example:

var Table = Reactable.Table,
    Tr = Reactable.Tr,
    Td = Reactable.Td;

ReactDOM.render(
    <Table className="table" id="table">
        <Tr>
            <Td column="Name" data="Griffin Smith">
                <b>Griffin Smith</b>
            </Td>
            <Td column="Age">18</Td>
        </Tr>
        <Tr>
            <Td column="Name">Lee Salminen</Td>
            <Td column="Age">23</Td>
        </Tr>
        <Tr>
            <Td column="Position">Developer</Td>
            <Td column="Age">28</Td>
        </Tr>
    </Table>,
    document.getElementById('table')
);

Customizing Columns

To override inferring the column list from the attributes of the passed data objects, you can either:

  • Pass a columns array property to the <Table> component, which can be either:
    • An array of strings, in which case only the given properties will be included as columns in the rendered table.
    • An array of objects, each of which must have a key and label property. The key property is the attribute of the row object from which to retrieve value, and the label is the text to render in the column header row.
  • Define a <Thead> component as the first child of the <Table>, with <Th> components as children (note the exclusion of a <Tr> here), each of which should have a "column" property. The children of these <Th> components (either strings or React components themselves) will be used to render the table headers. For example:
…

In this example, the position column will not be rendered.

Additional node types

Reactable also supports specifying a <tfoot> for your table, via the Reactable.Tfoot class. Per the HTML spec, there can only be one <Tfoot> per table and its only children should be React.DOM <tr> elements (not <Reactable.Tr> elements).

Preventing escaping of HTML

If you don't want to go all the way down the JSX rabbit hole to render individual cells as HTML, and you know your source data is safe, you can wrap strings in Reactable.unsafe to prevent their content from being escaped, like so:

var Table = Reactable.Table,
    unsafe = Reactable.unsafe;

ReactDOM.render(
    <Table className="table" id="table" data={[
        {
            'Name': unsafe('<b>Griffin Smith</b>'),
            'Github': unsafe('<a href="https://github.com/glittershark"></a>')
        },
        {
            'Name': unsafe('<b>Ian Zhang</b>'),
            'Github': unsafe('<a href="https://github.com/lofiinterstate"></a>')
        },
    ]}/>,
    document.getElementById('table')
);

You can also pass in unsafe strings as column labels or in a <Reactable.Th>

Pagination

You can also use pagination, by just specifying an itemsPerPage argument to the <Table> component. Include an optional pageButtonLimit argument to customize the number of page buttons in the pagination, which defaults to 10. For example:

<Table className="table" data={[
    { Name: 'Griffin Smith', Age: '18' },
    { Age: '23',  Name: 'Lee Salminen' },
    { Age: '28', Position: 'Developer' },
    { Name: 'Griffin Smith', Age: '18' },
    { Age: '30',  Name: 'Test Person' },
    { Name: 'Another Test', Age: '26', Position: 'Developer' },
    { Name: 'Third Test', Age: '19', Position: 'Salesperson' },
    { Age: '23',  Name: 'End of this Page', Position: 'CEO' },
]} itemsPerPage={4} pageButtonLimit={5} />

You can also change the default text on the buttons by including the previousPageLabel and nextPageLabel props.

Sorting

To enable sorting on all columns, just specify sortable={true} on the <Table> component. For further customization, ie disabling sort or using a custom sort function on a per-column basis, you can pass an array to sortable, which contains either string column names or column objects.

We've pre-built some sort functions for you.

  • CaseInsensitive will sort strings alphabetically regardless of capitalization (e.g. Joe Smith === joe smith)
  • Date will sort dates using JavaScript's native Date parser (e.g. 4/20/2014 12:05 PM)
  • Currency will sort USD format (e.g. $1,000.00)
  • Numeric will parse integer-like strings as integers (e.g. "1")
  • NumericInteger will parse integer strings (use Numeric if you might have floats)

To specify a custom sort function, use the following structure for the column object:


{column: 'Column Name', sortFunction: function(a, b){
    return a > b ? 1 : -1;
}}

You can also specify a default sort by passing in either a column name by itself, or an object with a column and a direction paramenter of either asc or desc. If no direction is specified, the default sort will be ascending. Example:


{column: 'Column Name', direction: 'asc' }

Combined example:

<Table className="table" id="table" data={[
    { Name: 'Lee Salminen', Age: '23', Position: 'Programmer'},
    { Name: 'Griffin Smith', Age: '18', Position: 'Engineer'},
    { Name: 'Ian Zhang', Age: '28', Position: 'Developer'}
]}
sortable={[
    {
        column: 'Name',
        sortFunction: function(a, b){
            // Sort by last name
            var nameA = a.split(' ');
            var nameB = b.split(' ');

            return nameA[1].localeCompare(nameB[1]);
        }
    },
    'Age',
    'Position'
]}
defaultSort={{column: 'Age', direction: 'desc'}}/>

In case you are constructing your table without the data attribute, and the cells contain some additional HTML elements, you can use the value property on the Td element to define the value to sort for.

In the following example we define two TDs, where the first contains some additional markup. We tell the Td to take "Griffin Smith" as value for data handling (filter or sort).

var Table = Reactable.Table,
    Tr = Reactable.Tr,
    Td = Reactable.Td;

ReactDOM.render(
    <Table className="table" id="table" sortable={true}>
        <Tr>
            <Td column="Name" value="Griffin Smith">
                

            </Td>
            <Td column="Age">18</Td>
        </Tr>
    </Table>,
    document.getElementById('table')
);

There is also an boolean defaultSortDescending option to default the sorting of a column to descending when clicked:


<Table className="table" id="table" data={[
    { Name: 'Lee Salminen', Age: '23', Position: 'Programmer'},
    { Name: 'Griffin Smith', Age: '18', Position: 'Engineer'},
    { Name: 'Ian Zhang', Age: '28', Position: 'Developer'}
]}
sortable={[
    'Age',
    'Position'
]}
defaultSort={{column: 'Age', direction: 'desc'}}
defaultSortDescending

Filtering

You can do simple case-insensitive filtering by specifying a filterable property on the table. This property should contain a list of columns which the filter is performed on. If the filterable property is provided, then an input box with class reactable-filter-input will be prepended to the thead of the table.

Example:

<Table className="table" id="table" data={[
    {'State': 'New York', 'Description': 'this is some text', 'Tag': 'new'},
    {'State': 'New Mexico', 'Description': 'lorem ipsum', 'Tag': 'old'},
    {'State': 'Colorado',
     'Description': 'new description that shouldn\'t match filter',
     'Tag': 'old'},
    {'State': 'Alaska', 'Description': 'bacon', 'Tag': 'renewed'},
]} filterable={['State', 'Tag']} />

There is also a filterBy() function on the component itself which takes a single string and applies that as the filtered value. It can be used like so:

var table = ReactDOM.render(
  <Table className="table" id="table" data={[
      {'State': 'New York', 'Description': 'this is some text', 'Tag': 'new'},
      {'State': 'New Mexico', 'Description': 'lorem ipsum', 'Tag': 'old'},
      {'State': 'Colorado',
       'Description': 'new description that shouldn\'t match filter',
       'Tag': 'old'},
      {'State': 'Alaska', 'Descri

GitHub Issues· 104 开放

在 GitHub 查看全部
  • #403

    A better fork

    更新于 2020年9月20日
  • #383

    Is this repository maintained?

    更新于 2020年9月20日
  • #377

    Multiple filters

    更新于 2020年8月7日
  • #402

    Table doesnt work in production mode?

    更新于 2020年7月3日
  • #387

    Cannot make Header row fixed

    更新于 2020年1月8日
  • #400

    cannot make row fixed and column fixed

    更新于 2019年12月16日
  • #369

    Mutliple Header Rows.

    更新于 2018年12月25日
  • #381

    React.DOM.tr deprecation warning in React v16.0+

    更新于 2018年4月25日
  • #372

    [QUESTION] Could I trigger click event on a single row?

    更新于 2018年4月8日
  • #396

    Why I'm having this problem?

    更新于 2018年4月4日

核心特点

  • •Installation
  • •Further Customization
  • •Even More Customization
  • •Additional node types
  • •Customizing Columns
  • •Preventing escaping of HTML
  • •Pagination
  • •Filtering
  • •Empty Data Sets
  • •Columns in the data array can be in any order, and you can omit any you like

> 标签

JavaScript

暂无评论,来聊聊你的看法吧

> 工具信息

发布日期2026年8月1日
最后更新2026年9月17日
分类编程语言
定价开源

> 相关工具

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言