如何在反应表中进行默认排序

Posted

技术标签:

【中文标题】如何在反应表中进行默认排序【英文标题】:How to do default sorting in react-table 【发布时间】:2020-05-22 02:55:45 【问题描述】:

我正在使用 react-table v7 https://www.npmjs.com/package/react-table 创建表格。

    我可以通过参考这个排序示例 https://codesandbox.io/s/github/tannerlinsley/react-table/tree/master/examples/sorting 对所有列进行排序。现在我不希望所有列都排序,但一些特定的列,我想默认降序对 2 列进行排序。有人可以帮我解决这个问题吗?

    对表格应用过滤器后,我想清除所有应用的过滤器。有人也可以帮忙解决这个问题吗?

谢谢

【问题讨论】:

github.com/tannerlinsley/react-table/blob/master/docs/api/…这样可以吗? 谢谢@KrinaSoni,请问具体哪一个可以用于默认排序? 【参考方案1】:

给出的另一个答案是针对不使用反应钩子的反应表(

const 
    getTableProps,
    getTableBodyProps,
    ...
 = useTable(
    
        columns,
        ....,
        initialState: 
            sortBy: [
                
                    id: 'columnId',
                    desc: false
                
            ]
        
    

【讨论】:

只是想补充一点,根据文档,sortBy 数组应该是 memoized 。参考:react-table.tanstack.com/docs/api/useSortBy#table-options【参考方案2】:

您可以将排序选项传递给 ReactTable 请尝试以下代码。并使用按钮单击呼叫清除功能进行清除尝试。

  constructor(props) 
    super(props);
    this.state = 
      sortOptions: [ id: 'age', desc: true , id: 'visits', desc: true ],
     
  

 <Table 
    sorted=this.state.sortOptions
    onSortedChange=val => 
    this.setState( sortOptions: val ) 
    columns=columns 
    data=data />

它对我有用 https://codesandbox.io/s/stupefied-hoover-ibz6f

【讨论】:

感谢@Oshini 的回复。我试图用访问器映射 id 但它不起作用。 :(你能帮我用其他方法吗? 您是否通过链接codesandbox.io/s/stupefied-hoover-ibz6f 。它显示的数据是默认排序的。 是的,我确实尝试过同样的事情,将 id 映射到访问器,但它不起作用:( 此解决方案不适用于使用 react-hooks 的 react-table 版本。请看我的回答:***.com/a/61278421/1571979【参考方案3】:

您需要导入 react-table 提供的 'useSortBy' 钩子以使其按预期工作。

import React from 'react'
import  useTable, useSortBy  from 'react-table';

function Table( columns, data, ...rest ) 
    const 
        getTableProps,
        getTableBodyProps,
        headerGroups,
        rows,
        prepareRow,
     = useTable(
        columns,
        data,
        ...(rest.initialState && 
            initialState: rest.initialState
        )
    , useSortBy);

【讨论】:

【参考方案4】:

我有一个稍微不同的用例,希望在初始加载时默认进行多重排序,但同时也要保持该排序顺序落后于任何未来的排序

这里的沙盒示例: https://codesandbox.io/s/goofy-shadow-9tskr?file=/src/App.js

诀窍不是使用内置的 getSortByToggleProps(),而是添加您自己的使用 setSortBy 函数的 onClick。

以下代码灵感来自@khai nguyen 的回答

import React from 'react'
import  useTable, useSortBy  from 'react-table';

function Table( columns, data, sortBy ...rest ) 
    const 
        getTableProps,
        getTableBodyProps,
        headerGroups,
        rows,
        prepareRow,
        setSortBy,
     = useTable(
        columns,
        data,
        initialState: sortBy
        )
    , useSortBy); 

然后在您的列标题元素中:

     ...PREV_TABLE_CODE
headerGroup.headers.map(column => (
         <th
         ...column.getHeaderProps()
         onClick=() => handleMultiSortBy(column, setSortBy, sortBy)
          >
         column.render( 
REST_TABLE_CODE....

还有handleMultiSortByCode(我的自定义函数,不是来自react-table):

isSortedDesc 可以是 true/false/undefined

export const handleMultiSortBy = (column, setSortBy, meinSortBy) => 
  //set sort desc, aesc or none?
  const desc =
    column.isSortedDesc === true
      ? undefined
      : column.isSortedDesc === false
      ? true
      : false;
  setSortBy([ id: column.id, desc , ...meinSortBy]);
;
 

注意:默认的 toggleSortBy() 函数中有一个 e.persist()。我不确定它提供了什么功能,但不使用它并没有我注意到的任何不良影响 - 库存多重排序不起作用(保持班次)但将其添加回来并不能解决这个问题。怀疑您可能需要 stock toggleSort。

【讨论】:

【参考方案5】:

非常感谢!我终于整理出了答案!关于默认排序,我对表格的数据进行了降序排序,默认情况下得到的数据为降序。对于清除按钮How to clear all filters in react-table,请参考此链接!

【讨论】:

以上是关于如何在反应表中进行默认排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据库表中按字母顺序对列进行排序? [关闭]

如何在此表中激活排序?

如何在java中对不同的数据类型进行排序并将它们打印在一个表中? (使用方法重载)

在 SQL 中排序时如何比较同一表中的两行?

EXT中如何按照某一列对数据库所有数据进行排序?默认的只能对当前页的数据进行升序降序排序!

如何在反应中将多个值添加到动态表中?