#javascript #reactjs #rxjs
#javascript #reactjs #rxjs
Вопрос:
Эй, ребята, я очень новичок в React и следил за учебным пособием о перехватах и хотел попробовать его, я не знаю, что код правильный на данный момент, поскольку я получаю ошибку в условии оператора if для проверки состояния входа в систему. Это всплывающая ошибка.
./src/components/Header.js
Line 50:20: Parsing error: Unexpected token, expected ","
48 |
49 | return (
> 50 | {if(loggedIn === true) {
| ^
51 | return (
52 | <React.Fragment>
53 | <CssBaseline />
Это Header.js
import React, {useEffect, useState} from 'react';
import Link from '@material-ui/core/Link';
import AppBar from '@material-ui/core/AppBar';
import Button from '@material-ui/core/Button';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import CssBaseline from '@material-ui/core/CssBaseline';
import { makeStyles } from '@material-ui/core/styles';
import {NavLink} from 'react-router-dom';
// import Grid from '@material-ui/core/Grid';
const useStyles = makeStyles((theme) => ({
appBar: {
borderBottom: `1px solid ${theme.palette.divider}`,
minHeight: 100,
background : '#1e202c',
},
toolbar: {
flexWrap: 'wrap',
color: 'white',
},
toolbarTitle: {
flexGrow: 1,
color: 'white',
},
link: {
margin: theme.spacing(1, 1.5),
},
}))
function Header() {
const classes = useStyles();
const [logState, setLogState] = useState({
loggedIn: false,
})
useEffect(() => {
if (sessionStorage.getItem('jwt')) {
setLogState({ loggedIn: true });
}
}, [setLogState]);
return (
{if(loggedIn === true) {
return (
<React.Fragment>
<CssBaseline />
<AppBar position="fixed" color="default" elevation={0} className={classes.appBar}>
<Toolbar className={classes.toolbar}>
<Typography variant="h6" color="inherit" noWrap className={classes.toolbarTitle}>
TestWebsite
</Typography>
<nav>
<Link component={NavLink} variant="button" color="inherit" href="#" to= "/" className={classes.link}>
Home
</Link>
<Link variant="button" color="inherit" href="#" className={classes.link}>
Accounts
</Link>
</nav>
<Button component={NavLink} href="#" color="inherit" variant="outlined" to="/logout/" className={classes.link} >
Logout
</Button>
</Toolbar>
</AppBar>
</React.Fragment>
)
} else {
return (
<React.Fragment>
<CssBaseline />
<AppBar position="fixed" color="default" elevation={0} className={classes.appBar}>
<Toolbar className={classes.toolbar}>
<Typography variant="h6" color="inherit" noWrap className={classes.toolbarTitle}>
TestWebsite
</Typography>
<nav>
</nav>
<Button href="#" component={NavLink} color="inherit" variant="outlined"
to="/signup/" className={classes.link} >
SignUp
</Button>
<Button component={NavLink} href="#" color="inherit" variant="outlined" to="/login/" className={classes.link} >
Login
</Button>
</Toolbar>
</AppBar>
</React.Fragment>
)
}
}
)
}
export default Header
Это правильный способ сделать это?
Спасибо
Ответ №1:
Вам не нужен возврат ({ }) вокруг вашего условия isLoggedIn . Также вам следует протестировать logState.LoggedIn вместо LoggedIn
Комментарии:
1. Привет, спасибо за ответ, но теперь я получаю эту ошибку
Line 49:11: 'loggedIn' is not defined no-undef
.2. Только что отредактировал мой ответ, вы должны протестировать logstate.LoggedIn вместо LoggedIn (в вашем коде нет переменной LoggedIn)
3. Можете ли вы также проверить мой код и сказать мне, почему мой оператор else не выполняется? Даже когда я выхожу из системы, он показывает тот же заголовок, что и при входе в систему. Спасибо
4. Вы привязываете useEffect к функции setLogState, что означает, что она будет запускаться только при инициализации и при изменении setLogState (скорее всего, никогда).). setLogState должен дополнительно вызываться при выходе из системы (например, после того, как действие выхода было успешно обработано вашим сервером) и при успешном входе в систему (когда сервер возвращает вам новый токен jwt)
5. Без логики входа / выхода из системы трудно сказать. Наивным способом было бы иметь метод в вашем компоненте
const handleLogin = (loggedIn) => {setLogState({loggedIn})}
. Затем на кнопке входа в систему,onclick={()=>handleLogin(true)}
, на кнопке выходаonclick={()=>handleLogin(false)}
из системы, но в более реалистичных сценариях у вас, вероятно, будут события при входе в систему и выходе из системы. В useEffect вы должны подписаться на них и соответствующим образом обновить состояние журнала. Затем useEffect должен вернуть метод, который отменяет эти подписки при размонтировании компонента
Ответ №2:
Попробуйте заменить if
на троичный оператор:
return loggedIn : Elem1 ? Elem2
Ответ №3:
Кажется, что в этом нет необходимости return
Header
, попробуйте это
function Header() {
const classes = useStyles();
const [logState, setLogState] = useState({
loggedIn: false,
});
useEffect(() => {
if (sessionStorage.getItem("jwt")) {
setLogState({ loggedIn: true });
}
}, [setLogState]);
if (logState.loggedIn === true) {
return (
<React.Fragment>
<CssBaseline />
<AppBar
position="fixed"
color="default"
elevation={0}
className={classes.appBar}
>
<Toolbar className={classes.toolbar}>
<Typography
variant="h6"
color="inherit"
noWrap
className={classes.toolbarTitle}
>
TestWebsite
</Typography>
<nav>
<Link
component={NavLink}
variant="button"
color="inherit"
href="#"
to="/"
className={classes.link}
>
Home
</Link>
<Link
variant="button"
color="inherit"
href="#"
className={classes.link}
>
Accounts
</Link>
</nav>
<Button
component={NavLink}
href="#"
color="inherit"
variant="outlined"
to="/logout/"
className={classes.link}
>
Logout
</Button>
</Toolbar>
</AppBar>
</React.Fragment>
);
}
return (
<React.Fragment>
<CssBaseline />
<AppBar
position="fixed"
color="default"
elevation={0}
className={classes.appBar}
>
<Toolbar className={classes.toolbar}>
<Typography
variant="h6"
color="inherit"
noWrap
className={classes.toolbarTitle}
>
TestWebsite
</Typography>
<nav></nav>
<Button
href="#"
component={NavLink}
color="inherit"
variant="outlined"
to="/signup/"
className={classes.link}
>
SignUp
</Button>
<Button
component={NavLink}
href="#"
color="inherit"
variant="outlined"
to="/login/"
className={classes.link}
>
Login
</Button>
</Toolbar>
</AppBar>
</React.Fragment>
);
}
Ответ №4:
попробуйте использовать условные выражения с использованием тернарного оператора, если используете js внутри return
conditon(if true)?<Element1/>:<Element2/>