如何在 ReactJS 中实现条件重定向?
How to implement conditional Redirects in ReactJS?
所以我有一个基本的逻辑页面,用户可以在其中输入他们的凭据。如果它们有效,它们将被重定向到私人主页。如果没有,他们将被重定向到注册页面。我的身份验证挂钩工作正常,因此当用户输入正确的凭据时,他们会按预期重定向到主页。问题是当他们没有注册时,他们不会被重定向到注册页面。我不知道为什么一个会起作用而另一个不起作用。
这是登录页面:
import { withRouter, Redirect, Route} from "react-router-dom";
import { useAuth } from "../auth";
const LoginPage = ({ children, history, ...rest }) => {
const auth = useAuth();
const handleLogin = (
(event) => {
event.preventDefault();
const {username, password} = event.target.elements;
const userVar = auth.signin(username, password);
return (
<Route
{...rest}
render={() =>
!userVar ? ( <Redirect to="/register"/> ) : ( <Redirect to="/"/> )
}
/>
);
}
);
if(auth.user)
return <Redirect to="/" />
return (
<div>
<h1>Log in</h1>
<form onSubmit={handleLogin}>
<label>
Username
<input name="username" type="username" placeholder="Username"/>
</label>
<br></br>
<label>
Password
<input name="password" type="password" placeholder="Password"/>
</label>
<br></br>
<button type="submit">Log in</button>
</form>
</div>
);
};
export default withRouter(LoginPage);
我的App.js:
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import HomePage from "./components/home.component"
import RegisterPage from "./components/register-user.component";
import LoginPage from "./components/login-user.component";
import { ProvideAuth } from "./auth";
import PrivateHome from "./PrivateHome.js";
import NewChat from "./components/new-chat.component";
import Logout from "./components/logout.component"
function App() {
return (
<ProvideAuth>
<Router>
<Switch>
<Route exact path="/login">
<LoginPage />
</Route>
<Route exact path="/register">
<RegisterPage />
</Route>
<PrivateHome exact path="/">
<HomePage />
<Route path="/chat/create">
<NewChat />
</Route>
<Route path="/logout">
<Logout />
</Route>
</PrivateHome>
</Switch>
</Router>
</ProvideAuth>
);
}
export default App;
我的主页:
import React from "react";
import { Route, Redirect } from "react-router-dom";
import { useAuth } from "./auth";
const PrivateHome = ({ children , ...rest}) => {
const auth = useAuth();
return (
<Route
{...rest}
render={() =>
(auth.user != null) ? (
children
) : (
<Redirect to="/login"/>
)
}
/>
);
}
export default PrivateHome;
还有我的认证页面:
import React, { useCallback, useContext, useEffect, useState } from "react";
const axios = require("axios");
const AuthContext = React.createContext();
export function ProvideAuth({ children }) {
const auth = useProvideAuth();
return (
<AuthContext.Provider value={auth}>
{children}
</AuthContext.Provider>
)
}
export const useAuth = () => {
return useContext(AuthContext);
}
function useProvideAuth() {
const [user, setUser] = useState(null);
const signin = (username, password) => {
try {
axios.post('http://localhost:5000/user/login', {username: username.value, password: password.value})
.then(response => {
localStorage.setItem("userToken", JSON.stringify(response.data.token));
setUser(JSON.stringify(response.data.token));
})
.catch(error => {
setUser(null);
alert(error);
});
} catch (error) {
alert(error);
}
return user;
};
const signup = (username, password) => {
axios.post('http://localhost:5000/user/register', {username: username.value, password: password.value})
.catch(error => {
alert(error);
});
return user;
};
const signout = () => {
localStorage.clear();
setUser(null);
return null;
};
return {
user,
signin,
signup,
signout
};
}
您可以使用 React Router 中的 usehistory()
:
import { withRouter, Redirect, Route, useHistory } from "react-router-dom";
const history = useHistory();
const handleLogin = (event) => {
event.preventDefault();
const { username, password } = event.target.elements;
const userVar = auth.signin(username, password);
return (
<Route
{...rest}
render={() =>
!userVar ? history.push("/register") : history.push("/")
}
/>
);
};
history.push()
推送路由并导航到它。
我相信即使这样也适用于您的情况:
const handleLogin = (event) => {
event.preventDefault();
const { username, password } = event.target.elements;
const userVar = auth.signin(username, password);
!userVar ? history.push("/register") : history.push("/");
};
您可以阅读 useHistory()
挂钩 here
所以我有一个基本的逻辑页面,用户可以在其中输入他们的凭据。如果它们有效,它们将被重定向到私人主页。如果没有,他们将被重定向到注册页面。我的身份验证挂钩工作正常,因此当用户输入正确的凭据时,他们会按预期重定向到主页。问题是当他们没有注册时,他们不会被重定向到注册页面。我不知道为什么一个会起作用而另一个不起作用。
这是登录页面:
import { withRouter, Redirect, Route} from "react-router-dom";
import { useAuth } from "../auth";
const LoginPage = ({ children, history, ...rest }) => {
const auth = useAuth();
const handleLogin = (
(event) => {
event.preventDefault();
const {username, password} = event.target.elements;
const userVar = auth.signin(username, password);
return (
<Route
{...rest}
render={() =>
!userVar ? ( <Redirect to="/register"/> ) : ( <Redirect to="/"/> )
}
/>
);
}
);
if(auth.user)
return <Redirect to="/" />
return (
<div>
<h1>Log in</h1>
<form onSubmit={handleLogin}>
<label>
Username
<input name="username" type="username" placeholder="Username"/>
</label>
<br></br>
<label>
Password
<input name="password" type="password" placeholder="Password"/>
</label>
<br></br>
<button type="submit">Log in</button>
</form>
</div>
);
};
export default withRouter(LoginPage);
我的App.js:
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import HomePage from "./components/home.component"
import RegisterPage from "./components/register-user.component";
import LoginPage from "./components/login-user.component";
import { ProvideAuth } from "./auth";
import PrivateHome from "./PrivateHome.js";
import NewChat from "./components/new-chat.component";
import Logout from "./components/logout.component"
function App() {
return (
<ProvideAuth>
<Router>
<Switch>
<Route exact path="/login">
<LoginPage />
</Route>
<Route exact path="/register">
<RegisterPage />
</Route>
<PrivateHome exact path="/">
<HomePage />
<Route path="/chat/create">
<NewChat />
</Route>
<Route path="/logout">
<Logout />
</Route>
</PrivateHome>
</Switch>
</Router>
</ProvideAuth>
);
}
export default App;
我的主页:
import React from "react";
import { Route, Redirect } from "react-router-dom";
import { useAuth } from "./auth";
const PrivateHome = ({ children , ...rest}) => {
const auth = useAuth();
return (
<Route
{...rest}
render={() =>
(auth.user != null) ? (
children
) : (
<Redirect to="/login"/>
)
}
/>
);
}
export default PrivateHome;
还有我的认证页面:
import React, { useCallback, useContext, useEffect, useState } from "react";
const axios = require("axios");
const AuthContext = React.createContext();
export function ProvideAuth({ children }) {
const auth = useProvideAuth();
return (
<AuthContext.Provider value={auth}>
{children}
</AuthContext.Provider>
)
}
export const useAuth = () => {
return useContext(AuthContext);
}
function useProvideAuth() {
const [user, setUser] = useState(null);
const signin = (username, password) => {
try {
axios.post('http://localhost:5000/user/login', {username: username.value, password: password.value})
.then(response => {
localStorage.setItem("userToken", JSON.stringify(response.data.token));
setUser(JSON.stringify(response.data.token));
})
.catch(error => {
setUser(null);
alert(error);
});
} catch (error) {
alert(error);
}
return user;
};
const signup = (username, password) => {
axios.post('http://localhost:5000/user/register', {username: username.value, password: password.value})
.catch(error => {
alert(error);
});
return user;
};
const signout = () => {
localStorage.clear();
setUser(null);
return null;
};
return {
user,
signin,
signup,
signout
};
}
您可以使用 React Router 中的 usehistory()
:
import { withRouter, Redirect, Route, useHistory } from "react-router-dom";
const history = useHistory();
const handleLogin = (event) => {
event.preventDefault();
const { username, password } = event.target.elements;
const userVar = auth.signin(username, password);
return (
<Route
{...rest}
render={() =>
!userVar ? history.push("/register") : history.push("/")
}
/>
);
};
history.push()
推送路由并导航到它。
我相信即使这样也适用于您的情况:
const handleLogin = (event) => {
event.preventDefault();
const { username, password } = event.target.elements;
const userVar = auth.signin(username, password);
!userVar ? history.push("/register") : history.push("/");
};
您可以阅读 useHistory()
挂钩 here