【发布时间】:2020-10-16 18:25:40
【问题描述】:
我正在开发一个需要登录的应用程序,单击登录按钮后,我需要重定向到另一个布局中的另一个视图,我尝试使用 this.props.history.push("/Inicio ") 在登录成功时重定向。在这种情况下,这是路径。
{
path: "/Inicio",
name: "Inicio",
component: Inicio,
layout: "/admin"
},
这是完整的代码
import React, { Component } from "react";
import {
Grid,
Col
} from "react-bootstrap";
import { Card } from "components/Card/Card.jsx";
import { FormInputs } from "components/FormInputs/FormInputs.jsx";
import Button from "components/CustomButton/CustomButton.jsx";
class Login extends Component {
constructor(props) {
super(props)
this.state = {
users: [],
user: '',
pass: '',
msg: '',
apiResponse:''
}
this.logChange = this.logChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this)
}
handleSubmit(event) {
event.preventDefault()
var data = {
user: this.state.user,
pass: this.state.pass,
msg: this.state.msg,
apiResponse: this.state.apiResponse
}
console.log(data)
fetch("http://localhost:9000/log/Login", {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
}).then(function(response) {
if (response.status >= 400) {
throw new Error("Bad response from server");
}
return response.json();
}).then((data) => {
if(data == "success"){
console.log(data)
this.setState({users: data});
this.props.history.push("/Inicio");
window.location.reload();
}
else{
if(data == 'El usuario o la contraseña no coinciden'){
this.setState({ apiResponse: data })
}
}
}).catch(function(err) {
console.log(err)
});
}
logChange(e) {
this.setState({[e.target.name]: e.target.value});
}
render() {
return (
<div className="content">
<p class="col-md-4"></p>
<Grid >
<Col md={5}>
<Card
title="Login"
content={
<form method='POST' onSubmit= {this.handleSubmit}>
<p class="col-md-2"></p>
<FormInputs
ncols={["col-md-7"]}
properties={[
{
label: "Usuario",
type: "text",
bsClass: "form-control",
placeholder: "Usuario",
maxlength: 20 ,
name: "user",
onChange: this.logChange
}
]}
/>
<p class="col-md-2"></p>
<FormInputs
ncols={["col-md-7"]}
properties={[
{
label: "Contraseña",
type: "password",
bsClass: "form-control",
placeholder: "Contraseña",
maxlength: 20,
name: "pass",
onChange: this.logChange
}
]}
/>
<p >{this.state.apiResponse}</p>
<br/>
<br/>
<Button bsStyle="info" pullRight fill type="submit">
Login
</Button>
<Button bsStyle="info" pullLeft fill type="submit">
Olvide mi Contraseña
</Button>
</form>
}
/>
</Col>
</Grid>
</div>
);
}
}
export default Login;
但在 handleSubmit() 中一切正常,除了 this.props.history.push("/Inicio") 因为它什么也没做。
index.js 代码
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Route, Switch, Redirect } from "react-router-dom";
import "bootstrap/dist/css/bootstrap.min.css";
import "./assets/css/animate.min.css";
import "./assets/sass/light-bootstrap-dashboard-react.scss?v=1.3.0";
import "./assets/css/demo.css";
import "./assets/css/pe-icon-7-stroke.css";
import AdminLayout from "layouts/Admin.jsx";
import LoginLayout from "layouts/LoginLayout.jsx";
import EfoodLayout from "layouts/EFoodLayout.jsx";
ReactDOM.render(
<BrowserRouter>
<Switch>
<Route path="/admin" render={props => <AdminLayout {...props} />} />
<Route path="/login" render={props => <LoginLayout {...props} />} />
<Route path="/Efood" render={props => <EfoodLayout {...props} />} />
<Redirect from="/" to="/login/Login" />
</Switch>
</BrowserRouter>,
document.getElementById("root")
);
登录布局
import React, { Component } from "react";
import { Route, Switch } from "react-router-dom";
import LoginNavbar from "components/Navbars/LoginNavbar";
import Footer from "components/Footer/Footer";
import routes from "routes.js";
class Login extends Component {
getRoutes = routes => {
return routes.map((prop, key) => {
if (prop.layout === "/login") {
return (
<Route
path={prop.layout + prop.path}
render={props => (
<prop.component
{...props}
handleClick={this.handleNotificationClick}
/>
)}
key={key}
/>
);
} else {
return null;
}
});
};
getBrandText = path => {
return "Bienvenido a E Food";
};
render() {
return (
<div className="wrapper">
<LoginNavbar
brandText={this.getBrandText(this.props.location.pathname)}
/>
<Switch>{this.getRoutes(routes)}</Switch>
<Footer />
</div>
);
}
}
export default Login;
希望你能帮助我,并感谢所有回答的人。 PD:如果您需要我的代码中的更多内容,请告诉我。
【问题讨论】:
-
有问题的组件是由
Route在Router内渲染以接收路由道具,还是用withRouterHOC 装饰?您能否更新整个组件代码,以及您的路由是什么样的? -
与此同时,您似乎没有将班级的
this正确绑定到handleSubmit。您将this分配给变量self并且当您尝试仍然使用this时,它正上方self用于更新状态。将this保存到变量self并不是您真正需要在反应中使用的模式。如果您可以使用整个组件和路由器代码更新您的问题,我们将更好地了解正在发生的事情。 -
感谢您的回答,正如我在下面所说的,我是新来使用 react,我已经从我在 Internet 上找到的模板中检索了我的所有前端,我已经编辑它看起来像我想要,所以我真的不知道它到底是如何工作的,我知道组件是什么,但我真的不知道这是否是我的想法,路由器也是如此,如果你不介意我可以通过 GitHub 或其他方式向您发送整个代码,前提是您当然接受我不想打扰您。
-
如果您可以在您的问题中发布相关代码,那就太好了,但是指向您的存储库的链接总比没有好。通常不建议使用代码链接,因为内容可能会更改、移动或删除,这样问题就会失去上下文。
-
非常感谢,我已经用问题的整个代码和 index.js 编辑了帖子,我希望这会有所帮助,如果没有,我会在这里发布我的 repo 链接,当然,当您访问该链接时,我会删除它以避免出现问题。
标签: node.js reactjs express react-router-dom