Прежде всего, в вашем методе handleClick () вы пытаетесь напрямую изменить состояние вашего компонента вместо использования встроенного в React метода setState (). Это предотвратит реакцию вашего пользовательского интерфейса на обновление, поскольку React не сможет узнать, изменилось ли состояние вашего компонента.
if(json['Result'] === 1) {
this.state.flag=1;
} else {
this.state.flag=2;
}
Вместо этого, если вы замените этот код на:
if(json['Result'] === 1) {
this.setState({flag: 1});
} else {
this.setState({flag: 2});
}
Тогда это приведет к повторной визуализации вашего компонента при каждом изменении состояния, и, следовательно, ваше приложение станет реактивным.
Далее, если вы хотите отобразить предупреждающее сообщение для пользователя, когда свойство флага равно 2, просто добавьте условное выражение в ваш JSX.
{ this.state.flag === 2 && <p>Your login credentials could not be verified, please try again.</p>}
Что это значитзаключается в том, что тег <p>
будет оцениваться (и, следовательно, обрабатываться), только если первая часть выражения, то есть this.state.flag === 2
, будет иметь значение true.
Если вы хотите перенаправить пользователя на другой маршрут после успешного завершениявойдите в систему, просто импортируйте компонент Redirect
из react-router-dom
и замените оператор return в вашем методе render () следующим:
if (this.state.flag === 1) {
return <Redirect to='/route' />
}
// else
return (
<div className = 'outer-container' ref={this.props.containerRef}>
// ... add the rest of your JSX
)
Для получения дополнительной информации об этом решении см. thisссылка .
Итак, ваш метод render () может выглядеть примерно так:
render() {
if (this.state.flag === 1) {
return <Redirect to='/route' />
}
// else
return (
<div className = 'outer-container' ref={this.props.containerRef}>
<div className = 'header'> Login </div>
<div className="content">
<div className="image">
<img src={LoginImage} />
</div>
{ this.state.flag === 2 && <p>Your login credentials could not be verified, please try again.</p>}
// ... add the rest of your JSX
)
}
~~~ UPDATE ~~~
Если подход <Redirect>
неork, есть и другой способ, который мы можем попробовать (также подробно здесь ). Мы можем перенаправить пользователя программно после того, как ваш запрос на выборку разрешится, при условии, что мы получим верный флаг от API. Таким образом, вы можете попробовать:
if(json['Result'] === 1) {
this.setState({ flag: 1 });
this.props.history.push('/route')
}
Для того, чтобы использовать этот подход, вам также нужно будет обернуть ваш компонент с withRouter
HOF в вашем операторе экспорта. Поэтому вместо:
export default MyComponent
Вам нужно будет сделать:
export default withRouter(MyComponent)
Просто убедитесь, что вы импортировали withRouter
из react-router-dom
.
Если вы беретеПри таком подходе вам больше не понадобится этот блок кода:
if (this.state.flag === 1) {
return <Redirect to='/route' />
}