【发布时间】:2017-01-16 17:00:22
【问题描述】:
我正在使用 React、Redux 和 React-Router。在 React 组件的 MapDispatchToProps() 中,我检查一个条件,如果该条件为真,我调用路由器的 browserHistory.push("/newLocation")。出于某种原因,我收到此错误:
警告:setState(...):在现有状态期间无法更新 过渡(例如在
render或其他组件的 构造函数)。渲染方法应该是 props 的纯函数和 状态;构造函数副作用是一种反模式,但可以移动 到componentWillMount。
有趣的是,我的 React 组件是无状态的(纯 JS 函数),所以我知道我没有在渲染方法中显式设置状态。深入研究错误看起来像是试图设置状态的反应路由器:
尽管有此警告,但应用程序似乎运行正常。不知道如何摆脱这个警告。
【问题讨论】:
-
你为什么在
mapPropsToDispatch中有这个逻辑? -
改用路由的
onEnter功能 -
mapDispatchToProps应该是一个纯函数,这意味着它根本不应该改变函数之外的任何东西,它唯一的作用应该是返回值。你可以用副作用来改变某些东西,但如果这些影响渗透到 Redux 或 React,那么你会得到像这里发生的错误。一种无害的副作用是console.log。副作用会导致复杂的应用程序,这就是 Redux 积极反对它们的原因。 -
我的 mapDispatchToProps 仍然是纯粹的——我不改变状态。重点是当我第一次进入该组件时是否存在特定条件,我只想“重定向”到另一个页面,否则继续正常处理。 Route 的 onEnter 属性非常适合我。
标签: reactjs redux react-router react-redux