mirror of
https://github.com/gosticks/react-table.git
synced 2026-08-19 16:30:21 +00:00
194 lines
4.3 KiB
JavaScript
Executable File
194 lines
4.3 KiB
JavaScript
Executable File
import React from 'react'
|
|
import styled from 'styled-components'
|
|
import { useTable, useResizeColumns, useFlexLayout } from 'react-table'
|
|
|
|
import makeData from './makeData'
|
|
|
|
const Styles = styled.div`
|
|
padding: 1rem;
|
|
|
|
.table {
|
|
${'' /* These styles are suggested for the table fill all available space in its containing element */}
|
|
display: block;
|
|
${'' /* These styles are required for a horizontaly scrollable table overflow */}
|
|
overflow: auto;
|
|
|
|
border-spacing: 0;
|
|
border: 1px solid black;
|
|
|
|
.thead {
|
|
${'' /* These styles are required for a scrollable body to align with the header properly */}
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
.tbody {
|
|
${'' /* These styles are required for a scrollable table body */}
|
|
overflow-y: scroll;
|
|
overflow-x: hidden;
|
|
height: 250px;
|
|
}
|
|
|
|
.tr {
|
|
:last-child {
|
|
.td {
|
|
border-bottom: 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
.th,
|
|
.td {
|
|
margin: 0;
|
|
padding: 0.5rem;
|
|
border-bottom: 1px solid black;
|
|
border-right: 1px solid black;
|
|
|
|
${'' /* In this example we use an absolutely position resizer,
|
|
so this is required. */}
|
|
position: relative;
|
|
|
|
:last-child {
|
|
border-right: 0;
|
|
}
|
|
|
|
.resizer {
|
|
display: inline-block;
|
|
background: blue;
|
|
width: 10px;
|
|
height: 100%;
|
|
position: absolute;
|
|
right: 0;
|
|
top: 0;
|
|
z-index: 1;
|
|
${'' /* prevents from scrolling while dragging on touch devices */}
|
|
touch-action:none;
|
|
|
|
&.isResizing {
|
|
background: red;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`
|
|
|
|
function Table({ columns, data }) {
|
|
const defaultColumn = React.useMemo(
|
|
() => ({
|
|
// When using the useFlexLayout:
|
|
minWidth: 30, // minWidth is only used as a limit for resizing
|
|
width: 150, // width is used for both the flex-basis and flex-grow
|
|
maxWidth: 200, // maxWidth is only used as a limit for resizing
|
|
}),
|
|
[]
|
|
)
|
|
|
|
const {
|
|
getTableProps,
|
|
getTableBodyProps,
|
|
headerGroups,
|
|
rows,
|
|
prepareRow,
|
|
} = useTable(
|
|
{
|
|
columns,
|
|
data,
|
|
defaultColumn,
|
|
},
|
|
useResizeColumns,
|
|
useFlexLayout
|
|
)
|
|
|
|
return (
|
|
<div {...getTableProps()} className="table">
|
|
<div>
|
|
{headerGroups.map(headerGroup => (
|
|
<div {...headerGroup.getHeaderGroupProps()} className="tr">
|
|
{headerGroup.headers.map(column => (
|
|
<div {...column.getHeaderProps()} className="th">
|
|
{column.render('Header')}
|
|
{/* Use column.getResizerProps to hook up the events correctly */}
|
|
<div
|
|
{...column.getResizerProps()}
|
|
className={`resizer ${column.isResizing ? 'isResizing' : ''}`}
|
|
/>
|
|
</div>
|
|
))}
|
|
</div>
|
|
))}
|
|
</div>
|
|
|
|
<div {...getTableBodyProps()} className="tbody">
|
|
{rows.map((row, i) => {
|
|
prepareRow(row)
|
|
return (
|
|
<div {...row.getRowProps()} className="tr">
|
|
{row.cells.map(cell => {
|
|
return (
|
|
<div {...cell.getCellProps()} className="td">
|
|
{cell.render('Cell')}
|
|
</div>
|
|
)
|
|
})}
|
|
</div>
|
|
)
|
|
})}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function App() {
|
|
const columns = React.useMemo(
|
|
() => [
|
|
{
|
|
Header: 'Name',
|
|
columns: [
|
|
{
|
|
Header: 'First Name',
|
|
accessor: 'firstName',
|
|
},
|
|
{
|
|
Header: 'Last Name',
|
|
accessor: 'lastName',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
Header: 'Info',
|
|
columns: [
|
|
{
|
|
Header: 'Age',
|
|
accessor: 'age',
|
|
width: 50,
|
|
},
|
|
{
|
|
Header: 'Visits',
|
|
accessor: 'visits',
|
|
width: 50,
|
|
},
|
|
{
|
|
Header: 'Status',
|
|
accessor: 'status',
|
|
},
|
|
{
|
|
Header: 'Profile Progress',
|
|
accessor: 'progress',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
[]
|
|
)
|
|
|
|
const data = React.useMemo(() => makeData(20), [])
|
|
|
|
return (
|
|
<Styles>
|
|
<Table columns={columns} data={data} />
|
|
</Styles>
|
|
)
|
|
}
|
|
|
|
export default App
|