javascript - Next JS Router.push('/uri') 抛出“Cannot update during an existing state transition”警告
问题描述
我在 Next JS 中有一个带有 redux 的简单登录表单。我有一个初始user
状态:
{
user: {}
}
并在表单提交后,login dispatch
会发生。状态将是:
{
user: {
authenticated: true",
....
}
}
所以每当我提交表单时,我希望我可以authenticated
通过 mapStateToProps 轻松获得。所以我有一个条件来检查是否authenticated
为真,所以我现在可以redirect
从登录表单到仪表板。
代码是:
static getDerivedStateFromProps(props, state) {
const user = props.user.user
if (user && user.authenticated) {
Router.push('/dashboard') =====> culprit?
}
return null
}
但是,我收到Cannot update during an existing state transition
控制台警告。
我最初使用componentWillReceiveProps
但令我惊讶的是,文档说应该避免它,因为它成为遗留代码。
为什么会这样?是因为错误的生命周期吗?我也尝试过shouldComponentUpdate
等,但它也不起作用。
我应该如何正确实施它?
完整代码如下:
import React, { Component } from 'react'
import { connect } from 'react-redux'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faLock } from '@fortawesome/free-solid-svg-icons'
import Router from 'next/router'
import { login } from '../actions'
class Login extends Component {
state = {
username: 'admin',
password: 'Password',
}
static getDerivedStateFromProps(props, state) {
const user = props.user.user
if (user && user.authenticated) {
Router.push('/dashboard') =======> culprit?
}
return null
}
handleChange = e => {
const { name, value } = e.target
this.setState({ [name] : value })
}
handleSubmit = e => {
e.preventDefault()
this.props.login(this.state)
}
render() {
const { username, password } = this.state
return (
<div id="content">
<div className="logo">
<div className="">
<div><img src="/static/images/login1.png" alt="Login1" align="left" /></div>
</div>
<div className="">
<div><img src="/static/images/login2.png" alt="Login2" align="left" width="350" /></div>
<div><p><span className="system_name">Information System v1.0</span></p></div>
</div>
</div>
<div className="login">
<div className="header">
<div className="text">
<div className="lock">
<center>
<FontAwesomeIcon icon={faLock} />
</center>
</div>
</div>
<p>LOGIN</p>
</div>
<div className="content">
<form onSubmit={e => this.handleSubmit(e)}>
<p>Please login to access all our features</p>
<input
type="text"
placeholder="Username"
name="username"
value={username}
autoComplete="off"
onChange={this.handleChange}
/>
<input
type="password"
placeholder="Password"
name="password"
value={password}
autoComplete="off"
onChange={this.handleChange}
/>
<button
type="submit"
>
<span>{this.props.user.isLoading ? 'Logging In....' : 'Login'}</span>
</button>
</form>
<a href="#">Forgot Password?</a>
</div>
</div>
</div>
)
}
}
const mapStateToProps = ({user}) => ({
user,
})
export default connect(mapStateToProps, { login })(Login)
解决方案
推荐阅读
- scala - 创建带有包含架构对象的行的火花数据框
- java - 如何检测用户何时启动另一个应用程序
- asp.net - SQL varbinay(max)列不保存图像
- python - Django python ValueError: no enough values to unpack (expected 2, got 1)
- php - 如何使用 PUT 方法和 API 保存图像
- java - java.lang.IllegalArgumentException:无法在 org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod 调用(PropertyUtilsBean.java:1778)
- python-3.x - Tkinter 按钮“clickbox”与全屏小部件分离
- kubernetes - On Premise Kubernetes 环境应用程序的部署和更新过程
- javascript - Javascript/Typescript:根据来自其他对象的条件在对象中附加值的最佳方法
- 2d - 如何根据收集的硬币获得高分?