我有一组非常简单的反应组件:
-
container
挂钩到redux并处理动作,存储订阅等 -
list
显示我的项目列表 -
new
这是一个向列表中添加新项目的表单
我有一些react-router路线如下:
<Route name='products' path='products' handler={ProductsContainer}>
<Route name='productNew' path='new' handler={ProductNew} />
<DefaultRoute handler={ProductsList} />
</Route>
这样既可以显示 list
也可以显示 form
,但不能同时显示两者 .
我想做的是在成功添加新项目后让应用程序重新路由到列表 .
到目前为止我的解决方案是在异步 dispatch
之后有一个 .then()
:
dispatch(actions.addProduct(product)
.then(this.transitionTo('products'))
)
这是正确的方法吗?或者我应该以某种方式触发另一个动作来触发路线改变?
5 回答
如果您不想使用更完整的解决方案,如Redux Router,您可以使用Redux History Transitions,它可以让您编写如下代码:
这与what you suggested类似,但稍微复杂一点 . 它仍然在引擎盖下使用相同的history库,因此它与React Router兼容 .
对于那些使用中间件API层来抽象他们使用isomorphic-fetch之类的东西,以及恰好使用redux-thunk的人,你可以简单地在你的动作中链接你的
dispatch
Promise,如下所示:这减少了按照建议here将代码库添加到代码中的需要,并且很好地将您的操作与其重定向一起定位,如redux-history-transitions中所做的那样 .
这是我的商店的样子:
我最终创建了一个看起来像这样的超级简单的中间件:
因此,您需要确保
successful
操作具有redirect
属性 . 另请注意,此中间件不会触发next()
. 这是有目的的,因为路径转换应该是动作链的结束 .如果您正在使用react-redux和react-router,那么我认为this link提供了一个很好的解决方案 .
这是我使用的步骤:
通过在react-router
<Route/>
组件中渲染组件或使用withRouter
创建高阶组件,将react-reacthistory
prop传递给组件 .接下来,创建要重定向到的路径(我称之为
to
) .第三,用
history
和to
调用你的redux动作 .最后,当您想要重定向时(例如,当您的redux操作结算时),请调用
history.push(to)
.我知道我在派对上已经很晚了,因为react-navigation已经包含在react-native文档中,但是对于在他们的应用程序中使用/使用Navigator api的用户来说,它仍然很有用 . 我尝试的是一点点hackish,一旦renderScene发生,我就在对象中保存导航器实例 -
我的api文件就是这个
现在在你的行动中你可以简单地打电话
你只需要从模块中导入你的api .