I want to show some records in a table using React but I got this error:
Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
- You might have mismatching versions of React and the renderer (such as React DOM)
- You might be breaking the Rules of Hooks
- You might have more than one copy of React in the same app See for tips about how to debug and fix this problem.
import React, { Component } from 'react'; import { makeStyles } from '@material-ui/core/styles'; import Table from '@material-ui/core/Table'; import TableBody from '@material-ui/core/TableBody'; import TableCell from '@material-ui/core/TableCell'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; import Paper from '@material-ui/core/Paper'; const useStyles = makeStyles(theme => ({ root: { width: '100%', marginTop: theme.spacing(3), overflowX: 'auto', }, table: { minWidth: 650, }, })); class allowance extends Component { constructor() { super(); this.state = { allowances: [], }; } componentWillMount() { fetch('http://127.0.0.1:8000/allowances') .then(data => { return data.json(); }).then(data => { this.setState({ allowances: data }); console.log("allowance state", this.state.allowances); }) } render() { const classes = useStyles(); return ( < Paper className = { classes.root } > < Table className = { classes.table } > < TableHead > < TableRow > < TableCell > Allow ID < /TableCell> < TableCell align = "right" > Description < /TableCell> < TableCell align = "right" > Allow Amount < /TableCell> < TableCell align = "right" > AllowType < /TableCell> < /TableRow> < /TableHead> < TableBody > { this.state.allowances.map(row => ( < TableRow key = { row.id } > < TableCell component = "th" scope = "row" > { row.AllowID } < /TableCell> < TableCell align = "right" > { row.AllowDesc } < /TableCell> < TableCell align = "right" > { row.AllowAmt } < /TableCell> < TableCell align = "right" > { row.AllowType } < /TableCell> < /TableRow> )) } < /TableBody> < /Table> < /Paper> ); } } export default allowance;
Advertisement
Answer
You can only call hooks from React functions. Read more here.
Just convert the Allowance
class component to a functional component.
const Allowance = () => { const [allowances, setAllowances] = useState([]); useEffect(() => { fetch("http://127.0.0.1:8000/allowances") .then(data => { return data.json(); }) .then(data => { setAllowances(data); }) .catch(err => { console.log(123123); }); }, []); const classes = useStyles(); return ( < Paper className = { classes.root } > < Table className = { classes.table } > < TableHead > < TableRow > < TableCell > Allow ID < /TableCell> < TableCell align = "right" > Description < /TableCell> < TableCell align = "right" > Allow Amount < /TableCell> < TableCell align = "right" > AllowType < /TableCell> < /TableRow> < /TableHead> < TableBody > { allowances.map(row => ( < TableRow key = { row.id } > < TableCell component = "th" scope = "row" > { row.AllowID } < /TableCell> < TableCell align = "right" > { row.AllowDesc } < /TableCell> < TableCell align = "right" > { row.AllowAmt } < /TableCell> < TableCell align = "right" > { row.AllowType } < /TableCell> < /TableRow> )) } < /TableBody> < /Table> < /Paper> ); }; export default Allowance;