I have a conditional to show top nav only when logged in:
const [adminState, setAdminState] = useState({
loggedIn: 0,
});
return (
<AdminState.Provider value={[adminState, setAdminState]}>
{adminState.loggedIn && <TopNav />} <--- this line is printing 0 when logged out
<Routes>
<Route element={<ProtectedRoutes />}>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Route>
<Route path="*" element={<PageNotFound />} />
</Routes>
</AdminState.Provider>
);
}
export default App;
When logged out, it is printing the number "0" where the conditional is.
CodePudding user response:
Note: && is the logical AND operator, not the conditional operator.
Because 0 && <TopNav /> results in the value 0, and React renders numbers when you provide them as children. It's just null, undefined, and booleans that it doesn't render (docs).
Instead, either:
Use
falseinstead of0for theloggedInflag; then your&&expression will result infalseand React won't display anything for that expression's result.Or
Use the actual conditional operator:
{adminState.loggedIn ? <TopNav /> : null}
CodePudding user response:
You can use JavaScript logical && operator so true && expression always evaluates to expression, and false && expression always evaluates to false.
Therefore, if the condition is true, the element right after && will appear in the output. If it is false, React will ignore and skip it.
Just change :
const [adminState, setAdminState] = useState({
loggedIn: 0,
});
to :
const [adminState, setAdminState] = useState({
loggedIn: true,
});
