#reactjs
#reactjs
Вопрос:
Я хочу включить вход в систему для выхода из системы.
Я реализовал это способом, показанным ниже. Но он отображается только тогда, когда я обновляю страницу. Я бы хотел, чтобы это происходило при запуске вместо жесткого обновления.
import React from "react"; import logo from "../logo.svg";
import { isLogin, logout } from '../utils/utility';
import { useHistory } from "react-router-dom";
import useForceUpdate from 'use-force-update';
const Header = () => {
let history = useHistory();
const forceUpdate = useForceUpdate();
return (
<div>
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Mobile Store Management System</h1>
<div>
{ //Check if message failed
isLogin()
? <div> <h4 style={{ display: "inline" }}><button style={{ 'cursor': 'pointer', display: "inline" }}
onClick={(e) => {
logout();
forceUpdate();
history.push('/')
}
}>Logout</button></h4> </div>
: <div> <h4 style={{ display: "inline" }}>
<button style={{ 'cursor': 'pointer', display: "inline" }}
onClick={(e) => {
logout();
forceUpdate() ;
history.push('/');
}}>Login</button></h4> </div>
}
<h4 style={{ display: "inline" }}><button style={{ 'cursor': 'pointer', display: "inline" }} onClick={() => history.push('/register')} >Register</button></h4>
</div>
</header>
</div>
) } export default Header;
Также у меня есть маршрутизатор, из которого он генерируется:
import React from 'react';
import { BrowserRouter, Route, Switch} from 'react-router-dom';
import App from '../components/App';
import SignIn from '../components/SignIn'
import NotFoundPage from '../components/NotFoundPage';
import PrivateRoute from '../components/PrivateRoutes';
import PublicRoute from '../components/PublicRoute';
import Header from '../components/Header';
import Register from '../components/Register'
const AppRouter = () => (
<BrowserRouter>
<div>
<Header />
<Switch>
<PublicRoute component={Register} path="/register" exact />
<PublicRoute restricted={true} component={SignIn} path="/" exact />
<PrivateRoute component={App} path="/Admin" exact />
<Route component={NotFoundPage} />
</Switch>
</div>
</BrowserRouter>
)
export default AppRouter;
Любая помощь была бы большой благодарностью заранее.
Комментарии:
1. Я не думаю, что что-то вызывает повторный рендеринг, поскольку с точки зрения React ничего не меняется (по крайней мере, из кода, которым вы поделились). Возможно, попробуйте управлять состоянием кнопки с помощью состояния компонента и обновлять его по щелчку вместо импортированной функции.
Ответ №1:
Перед отображением страницы вам необходимо экспортировать ее isLogin
в a const
. Например.
import React from "react"; import logo from "../logo.svg";
import { isLogin, logout } from '../utils/utility';
import { useHistory } from "react-router-dom";
import useForceUpdate from 'use-force-update';
const Header = () => {
let history = useHistory();
const forceUpdate = useForceUpdate();
const login = isLogin();
return (
<div>
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Mobile Store Management System</h1>
<div>
{ // Check if message failed
login
? <div>
<h4 style={{ display: "inline" }}>
<button
style={{ 'cursor': 'pointer', display: "inline"}}
onClick={(e) => {
logout();
forceUpdate();
history.push('/')
}}
>Logout</button>
</h4>
</div>
: <div>
<h4 style={{ display: "inline" }}>
<button
style={{ 'cursor': 'pointer', display: "inline" }}
onClick={(e) => {
logout();
forceUpdate() ;
history.push('/');
}}
>Login</button>
</h4>
</div>
}
<h4 style={{ display: "inline" }}>
<button
style={{ 'cursor': 'pointer', display: "inline" }}
onClick={() => history.push('/register')}
>Register</button>
</h4>
</div>
</header>
</div>
)
}
export default Header;