Reputation: 549
How to add link per TableRow in .map?
*my error is validateDOMNesting(...): cannot appear as a child of "< a >" im using react router react-router-dom
how to add link in every loop of .map in Table TableRow?
import React, { Fragment } from 'react'
import { Paper } from 'material-ui'
import Table from 'material-ui/Table';
import TableBody from 'material-ui/Table/TableBody';
import TableCell from 'material-ui/Table/TableCell';
import TableHead from 'material-ui/Table/TableHead';
import TableRow from 'material-ui/Table/TableRow';
import { connect } from 'react-redux'
// import { Edit, Delete } from '@material-ui/icons'
import { withStyles } from 'material-ui/styles'
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
const drawerWidth = 100;
class Listofbond extends React.Component {
render() {
console.log(this.props);
const { MainProps, classes } = this.props;
return (
<Router>
<Paper>
<Table >
<TableHead>
<TableRow>
<TableCell>Bondame</TableCell>
</TableRow>
</TableHead>
<TableBody>
{[1, 2, 3].map(n => {
return (
<Link to={`/bond/${n}/`} key={n}>
<TableRow>
<TableCell component="th" scope="row">
{n}
</TableCell>
</TableRow>
</Link>
);
})}
</TableBody>
</Table>
</Paper>
</Router>
)
}
}
export default Listofbond;
Upvotes: 28
Views: 21136
Reputation: 3624
For those using react-router-dom v6+, this works:
import { useNavigate } from "react-router-dom";
...
export const MyComponent({ }) {
let navigate = useNavigate();
// Using table as per the OP's code:
return (
<TableContainer>
<Table>
<TableHead>
<TableRow>
<TableCell>Bondame</TableCell>
</TableRow>
</TableHead>
<TableBody>
{[1, 2, 3].map(n => {
return (
<TableRow onClick={() => { navigate(`/bond/${n}/`); }}>
<TableCell component="th" scope="row">
{n}
</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</TableContainer>
);
};
Upvotes: 4
Reputation: 156
Use component='div'
for almost all components (Table
, TableHead
, TableBody
, TableCell
s and even the (only) TableRow
in TableHead
) and component={Link}
for the other TableRow
s (in TableBody
):
<TableContainer>
<Table component='div'>
<TableHead component='div'>
<TableRow component='div'> { /* Use `div` here, too */ }
<TableCell component='div'>
...
</TabelCell>
<TableCell component='div'>
...
</TabelCell>
...
</TableRow>
</TableHead>
<TableBody component='div'>
<TableRow component={Link}> { /* Use `Link` here */ }
<TableCell component='div'>
...
</TabelCell>
<TableCell component='div'>
...
</TabelCell>
...
</TableRow>
<TableRow component={Link}> { /* Use `Link` here */ }
...
</TableRow>
...
</TableBody>
</Table>
</TableContainer>
By the way, you miss HTML native <table>
. But everything looks as native.
I think, unfortunately, there is no other way. See: https://stackoverflow.com/a/17147876/5318303
Upvotes: 9
Reputation: 2755
There are many workarounds to this because the solution above gives an error validateDOMNesting(...)
on the console.
add Link
tag around the text itself ( the column value ) inside
the <ColumnCell>
, although it changes the text into more like
<a>
tag .. but you could handle this. by doing this style={{ textDecoration: 'none', color: 'black' }}
<TableCell key={column.id} align={column.align}>
<Link
to={`/elsewhere/${row.id}`}
style={{ textDecoration: 'none', color: 'black' }}
>
{value}
</Link>
</TableCell>
create a button with each table row.
Upvotes: 1
Reputation: 677
The correct way to do this is to use the component
prop of the TableRow
component:
<TableRow component={Link} to={`/bond/${n}/`} key={n}>
...
</TableRow>
Upvotes: 21
Reputation: 141
Link is applied to the component for which onClick is defined, so wrap your TableRow into a div like this:
<Link to={`/bond/${n}/`} key={n}>
<div>
<TableRow>
<TableCell component="th" scope="row">
{n}
</TableCell>
</TableRow>
</div>
</Link>
Upvotes: 0