在阅读教程之后,我成功弄清了<Redirect />
的用法,代码如下:
import React from 'react';
import Login from './Login';
import Dashboard from './Dashboard';
import {Route, NavLink, BrowserRouter, Redirect} from 'react-router-dom';
const supportsHistory = 'pushState' in window.history;
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
username: '',
password: '',
redirectToDashboard: false,
}
}
//-----------------------LOGIN METHODS-----------------------------
onChangeInput(e) {
this.setState({[e.target.name]:e.target.value});
}
login(e) {
e.preventDefault();
const mainThis = this;
if (mainThis.state.username && mainThis.state.password) {
fetch('APILink')
.then(function(response) {
response.text().then(function(data) {
data = JSON.parse(data);
if (!data.error) {
mainThis.setState({redirectToDashboard:true});
} else {
alert(data.msg);
}
})
})
} else {
alert('Username and Password needed');
}
}
renderRedirect = () => {
if (this.state.redirectToDashboard) {
return <Redirect exact to='/company' />
} else {
return <Redirect exact to='/login' />
}
}
render() {
let renderedComp;
return(
<BrowserRouter
basename='/'
forceRefresh={!supportsHistory}>
<React.Fragment>
{this.renderRedirect()}
<Route exact path="/company" render={()=><Dashboard/>} />
<Route exact path="/login" render={()=><Login login={(e)=>this.login(e)} onChangeInput={(e)=>this.onChangeInput(e)} />} />
</React.Fragment>
</BrowserRouter>
)
}
}
这个组件的显示基于this.state.redirectToDashboard
的值,但是由于:
onChangeInput(e) {
this.setState({
[e.target.name]:e.target.value
});
}
每个输入都会重新呈现页面,留下以下内容:
我知道是什么导致了这个警告,只是我想不出其他方法使其工作。我应该做出哪些更改或者至少有一个好的想法来使其正常工作呢?警告:您尝试重定向到当前所在路由:“/login”
<Redirect exact to='/login' />
组件呢?也许你可以直接在render方法中编写例如this.state.redirectToDashboard && <Redirect exact to='/company' />
? - Tholle<Redirect exact to='/login' />
,这样当我打开http://localhost:3000/
时,它会重定向到http://localhost:3000/login
,而不是给我一个空白屏幕。 - Carl Binallathis.setState({[e.target.name]:e.target.value});
仍会导致重新渲染吗?我也尝试将其更改为this.onChangeInput.bind(this)
,但出现了相同的错误。 - Carl Binalla