我如何正确地推动?
How i do a push properly?
我正在用 React 制作一个登录页面。登录完成后,我的反应需要重定向到我的页面 FrontFeed
。我正在使用 this.props.history.push('/feed');
推送页面,但是当访问登录页面并输入我的凭据时,登录重定向到具有不同 url 的登录,我需要再次登录,而且只有第二次登录重定向到 FrontFeed
.
的时间
第一次访问页面时
我进行了登录(凭据是正确的),我将页面重定向到同一页面,但是 url /#/
-> /?#/
。没有调用函数,因为没有申请,本地存储没有保存任何东西。
但我第二次登录时,一切正常,申请已完成,本地存储已存储,我的页面被重定向到 http://localhost:3000/?#/feed
。
我不确定我使用的 react-router-dom
是否正确。但是有点不对劲。
import React from 'react';
import './css/App.css';
import MainPage from './pages/MainPage.js';
function App() {
return (
<MainPage/>
);
}
export default App;
import React, { Component } from 'react';
import '../css/MainPage.css';
import FrontFeed from './FrontFeed.js';
import Login from './Login.js';
import {
Route,
NavLink,
HashRouter
} from "react-router-dom";
export default class MainPage extends Component{
componentDidMount() {
var token = localStorage.getItem('Token');
console.log(token);
}
render () {
return (
<HashRouter>
<div className="app">
<div className="content">
<Route exact path="/" component={Login}/>
<Route path="/feed" component={FrontFeed}/>
</div>
</div>
</HashRouter>
);
}
}
import React, { Component } from 'react';
import '../css/Login.css';
import UserService from '../services/UserService'
import {ToastsContainer, ToastsContainerPosition, ToastsStore} from 'react-toasts';
export default class Login extends Component {
constructor(props) {
super(props);
this.state = {
user: new UserService(),
password: '',
username: '',
}
}
componentDidMount() {
var token = localStorage.getItem('Token');
if(token) {
this.props.history.push('/feed');
}
}
handleChangeUsername(event) {
this.setState({username: event.target.value});
}
handleChangePassword(event) {
this.setState({password: event.target.value});
}
handleSubmit(event) {
this.state.user.login(this.state.username, this.state.password).then(res => {
if (res.data.super) {
localStorage.setItem('Token', res.data.key);
ToastsStore.success('Login Sucess!');
} else {
ToastsStore.success("You aren't super!");
}
this.props.history.push('/feed');
}).catch(err => {
ToastsStore.success('Login Failed');
})
}
render() {
return (
<div className="loginContent">
<ToastsContainer position={ToastsContainerPosition.BOTTOM_CENTER}
store={ToastsStore}/>
<div className="title">Login to ADM</div>
<div className="credentialsContainer">
<form onSubmit={e => this.handleSubmit(e)}>
<div className="username">
Username:
<div className="inputUsername">
<input type="text"
value={this.state.username}
onChange={e => this.handleChangeUsername(e)} />
</div>
</div>
<div className="password">
Password:
<div className="inputPassword">
<input type="password"
value={this.state.password}
onChange={e => this.handleChangePassword(e)} />
</div>
</div>
<div className="submitButton">
<input type="submit" value="Search" />
</div>
</form>
</div>
</div>
);
}
}
将 event.preventDefault();
放在 handleSubmit 函数中,它会阻止页面重新加载,这就是为什么您的函数没有在第一次执行的原因
典型的表单将使用方法
将数据发送到操作
<form action="/action_page.php" method="post">
但由于您使用的是 handleSubmit()
而不是操作,因此它不会将数据发送到任何地方(您可以在此处阅读有关表单的更多信息 https://www.w3schools.com/html/html_forms.asp )
当您第一次提交时,您将在 url 中看到您在表单中输入的值(如果您在其中输入了名称)但是由于您没有在其中输入名称你的表格因此你在 url 中看不到它们(假设你上面提供的代码)
event.preventDefault()
阻止了通常的表单提交和页面重新加载,因此您可以执行其中的功能(我对我从事的项目所做的同样的事情)
将 event.preventDefault();
放入表单后,登录将从第一次尝试开始工作,反应路由器会将其重定向到 /feed
页面
希望我的回答对您有所帮助
我正在用 React 制作一个登录页面。登录完成后,我的反应需要重定向到我的页面 FrontFeed
。我正在使用 this.props.history.push('/feed');
推送页面,但是当访问登录页面并输入我的凭据时,登录重定向到具有不同 url 的登录,我需要再次登录,而且只有第二次登录重定向到 FrontFeed
.
第一次访问页面时
我进行了登录(凭据是正确的),我将页面重定向到同一页面,但是 url /#/
-> /?#/
。没有调用函数,因为没有申请,本地存储没有保存任何东西。
但我第二次登录时,一切正常,申请已完成,本地存储已存储,我的页面被重定向到 http://localhost:3000/?#/feed
。
我不确定我使用的 react-router-dom
是否正确。但是有点不对劲。
import React from 'react';
import './css/App.css';
import MainPage from './pages/MainPage.js';
function App() {
return (
<MainPage/>
);
}
export default App;
import React, { Component } from 'react';
import '../css/MainPage.css';
import FrontFeed from './FrontFeed.js';
import Login from './Login.js';
import {
Route,
NavLink,
HashRouter
} from "react-router-dom";
export default class MainPage extends Component{
componentDidMount() {
var token = localStorage.getItem('Token');
console.log(token);
}
render () {
return (
<HashRouter>
<div className="app">
<div className="content">
<Route exact path="/" component={Login}/>
<Route path="/feed" component={FrontFeed}/>
</div>
</div>
</HashRouter>
);
}
}
import React, { Component } from 'react';
import '../css/Login.css';
import UserService from '../services/UserService'
import {ToastsContainer, ToastsContainerPosition, ToastsStore} from 'react-toasts';
export default class Login extends Component {
constructor(props) {
super(props);
this.state = {
user: new UserService(),
password: '',
username: '',
}
}
componentDidMount() {
var token = localStorage.getItem('Token');
if(token) {
this.props.history.push('/feed');
}
}
handleChangeUsername(event) {
this.setState({username: event.target.value});
}
handleChangePassword(event) {
this.setState({password: event.target.value});
}
handleSubmit(event) {
this.state.user.login(this.state.username, this.state.password).then(res => {
if (res.data.super) {
localStorage.setItem('Token', res.data.key);
ToastsStore.success('Login Sucess!');
} else {
ToastsStore.success("You aren't super!");
}
this.props.history.push('/feed');
}).catch(err => {
ToastsStore.success('Login Failed');
})
}
render() {
return (
<div className="loginContent">
<ToastsContainer position={ToastsContainerPosition.BOTTOM_CENTER}
store={ToastsStore}/>
<div className="title">Login to ADM</div>
<div className="credentialsContainer">
<form onSubmit={e => this.handleSubmit(e)}>
<div className="username">
Username:
<div className="inputUsername">
<input type="text"
value={this.state.username}
onChange={e => this.handleChangeUsername(e)} />
</div>
</div>
<div className="password">
Password:
<div className="inputPassword">
<input type="password"
value={this.state.password}
onChange={e => this.handleChangePassword(e)} />
</div>
</div>
<div className="submitButton">
<input type="submit" value="Search" />
</div>
</form>
</div>
</div>
);
}
}
将 event.preventDefault();
放在 handleSubmit 函数中,它会阻止页面重新加载,这就是为什么您的函数没有在第一次执行的原因
典型的表单将使用方法
将数据发送到操作<form action="/action_page.php" method="post">
但由于您使用的是 handleSubmit()
而不是操作,因此它不会将数据发送到任何地方(您可以在此处阅读有关表单的更多信息 https://www.w3schools.com/html/html_forms.asp )
当您第一次提交时,您将在 url 中看到您在表单中输入的值(如果您在其中输入了名称)但是由于您没有在其中输入名称你的表格因此你在 url 中看不到它们(假设你上面提供的代码)
event.preventDefault()
阻止了通常的表单提交和页面重新加载,因此您可以执行其中的功能(我对我从事的项目所做的同样的事情)
将 event.preventDefault();
放入表单后,登录将从第一次尝试开始工作,反应路由器会将其重定向到 /feed
页面
希望我的回答对您有所帮助