React is complaining about code below, saying it useEffect is being called conditionally:
import React, { useEffect, useState } from 'react' import VerifiedUserOutlined from '@material-ui/icons/VerifiedUserOutlined' import withStyles from '@material-ui/core/styles/withStyles' import firebase from '../firebase' import { withRouter } from 'react-router-dom' function Dashboard(props) { const { classes } = props const [quote, setQuote] = useState('') if(!firebase.getCurrentUsername()) { // not logged in alert('Please login first') props.history.replace('/login') return null } useEffect(() => { firebase.getCurrentUserQuote().then(setQuote) }) return ( <main> // some code here </main> ) async function logout() { await firebase.logout() props.history.push('/') } } export default withRouter(withStyles(styles)(Dashboard))
And that returns me the error:
React Hook “useEffect” is called conditionally. React Hooks must be called in the exact same order in every component render.
Does anyone happen to know what the problem here is?
Advertisement
Answer
Your code, after an if
statement that contains return
, is equivalent to an else
branch:
if(!firebase.getCurrentUsername()) { ... return null } else { useEffect(...) ... }
Which means that it’s executed conditionally (only when the return
is NOT executed).
To fix:
useEffect(() => { if(firebase.getCurrentUsername()) { firebase.getCurrentUserQuote().then(setQuote) } }, [firebase.getCurrentUsername(), firebase.getCurrentUserQuote()]) if(!firebase.getCurrentUsername()) { ... return null }