如何自定义反应表 7 中的列

Posted

技术标签:

【中文标题】如何自定义反应表 7 中的列【英文标题】:How to customize a column in react table 7 【发布时间】:2020-08-02 08:23:22 【问题描述】:

我想在我的某一列中添加一个按钮,这样当我单击它时,我可以获取该按钮所在行的详细信息。目前我的表中没有按钮,我不知道如何设置按钮初始化。另外我想知道如何在单元格中添加自定义标签。我想在一个单元格中添加两个标签,一个标题标签和一个段落标签,但它们必须在同一个单元格中。

    const location = useLocation();

    useEffect(() => 
        console.log(location.state);
    );

    const data = React.useMemo(
        () => [
            
                col1: 'Hello',
                col2: "world",
            ,
            
                col1: 'react-table',
                col2: 'rocks',
            ,
            
                col1: 'whatever',
                col2: 'you want',
            ,
            
                col1: 'whatever',
                col2: 'you want',
            ,
            
                col1: 'whatever',
                col2: 'you want',

            ,
            
                col1: 'whatever',
                col2: 'you want',

            ,
            
                col1: 'whatever',
                col2: 'you want',

            ,
            
                col1: 'whatever',
                col2: 'you want',

            ,
            
                col1: 'whatever',
                col2: 'you want',

            ,

        ],
        [],
    );
    const columns = React.useMemo(
        () => [
            
                Header: 'Student Name',
                accessor: 'col1', // accessor is the "key" in the data
                show: false
            ,
            
                Header: 'Reg-No',
                accessor: 'col2',
            ,
            
                Header: 'QUIZEZ',
                accessor: '',
            ,
            
                Header: 'ASSIGNMENT',
                accessor: '',
            ,
            
                Header: 'FIRST TERM',
                accessor: '',
            ,
            
                Header: 'MID TERM',
                accessor: '',
            ,
            
                Header: 'FINAL TERM',
                accessor: '',

            ,
        ],
        [],
    );

    const 
        getTableProps,
        getTableBodyProps,
        headerGroups,
        page,
        prepareRow,
        canPreviousPage,
        canNextPage,
        nextPage,
        previousPage,
        setPageSize,
        pageSize,

     = useTable( columns, data, initialState:  pageIndex: 0, pageSize: 7  , useExpanded, usePagination);


    return (
        <>
            <div className="row">
                <div className="col class-top-heading">
                    <h4>Class: 7-B</h4>
                    <h4>Subject: English</h4>
                    <h4>No of Students: 32</h4>
                </div>
            </div>
            <div className="row">
                <div className="col table-div-1 highlight" style= 'overflowY': 'auto', 'height': '455px' >
                    <table ...getTableProps()>
                        <thead>
                            headerGroups.map(headerGroup => (
                                <tr ...headerGroup.getHeaderGroupProps()>
                                    headerGroup.headers.map(column => (
                                        <th
                                            ...column.getHeaderProps()
                                        >
                                            column.render('Header')
                                        </th>
                                    ))
                                </tr>
                            ))
                        </thead>
                        <tbody ...getTableBodyProps()>
                            page.map(row => 
                                prepareRow(row)
                                return (
                                    <tr key=123 ...row.getRowProps() >
                                        row.cells.map(cell => 
                                            return (
                                                <td
                                                    ...cell.getCellProps()
                                                    onClick=() => console.log(row.original.col2)
                                                >
                                                    cell.render('Cell')
                                                </td>
                                            )
                                        )
                                    </tr>
                                )
                            )
                        </tbody>
                    </table>
                </div>
            </div>
            <div className="row pagination">
                <button onClick=() => previousPage() disabled=!canPreviousPage>
                    '<'
                </button>" "
                <button onClick=() => nextPage() disabled=!canNextPage>
                    '>'
                </button>" "
                <select
                    value=pageSize
                    onChange=e => 
                        setPageSize(Number(e.target.value));
                    
                >
                    [7, 10, 20, 30].map(pageSize => (
                        <option key=pageSize value=pageSize>
                            Show pageSize
                        </option>
                    ))
                </select>
            </div>


        </>

【问题讨论】:

【参考方案1】:

您可以像这样修改列:


        accessor: 'accessor',
        Header: 'Header',
        Cell: ( row:  original  ) => (
            <button
                onClick=(() => console.log(original))
            >
                Button text
            </button>
        ),
,

或者您可以修改默认表格单元格DefaultCell.js

const DefaultCell = ( cell:  value, column , row:  original  ) => (
 <span
    style=
     whiteSpace: 'pre-wrap',
    
 >
  column.id === 'button' ?
   (
    <button
        onClick=(() => console.log(original))
    >
        Button text
    </button>
   ) : value
 </span>
)

react-table 用法:

const defaultColumn = React.useMemo(
 () => (
  minWidth: 5,
  width: 150,
  maxWidth: 400,
  Cell: DefaultCell,
 ),
 []
);

const 
    getTableProps,
    getTableBodyProps,
    headerGroups,
    page,
    prepareRow,
    canPreviousPage,
    canNextPage,
    nextPage,
    previousPage,
    setPageSize,
    pageSize,
 = useTable(
  
   columns,
   data,
   defaultColumn
  ,
  initialState:  pageIndex: 0, pageSize: 7  ,
  useExpanded,
  usePagination
);

【讨论】:

非常感谢它确实有帮助,但您能否告诉我如何连续添加自定义元素。就像在一个单元格中一样,我想在名称下方添加两个名称和滚动号,这样我就不必为滚动号使用另一列。以及如何添加输入字段而不是按钮。我对这些东西很陌生,尤其是 javascript,因此非常感谢您的帮助。 你可以在官方docs阅读更多示例【参考方案2】:

您也可以只创建一个样式化的 td 元素并找到 cell.column.id 值并有条件地呈现您需要的任何样式。但是,如果您有一堆不同的条件,这是重复的。

【讨论】:

以上是关于如何自定义反应表 7 中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应材料表的列中添加自定义复选框?

如何为反应表 7 提供自定义排序功能?

求教在sqlserver2008中的表中怎么添加一列自增的列?

从 Kentico 10 中的自定义表重复器中过滤重复的列值

GridControl列自定义排序

sql主键列自增问题