如何在React组件中订阅Redux动作

时间:2018-10-01 12:10:31

标签: javascript reactjs redux redux-saga react-boilerplate

我试图弄清楚如何在React组件中订阅Redux动作。 我没有在Google上找到任何东西,因此在这里打开一个问题,看看是否有人可以帮助我。

当用户尝试登录时,我调度#include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] List rainfall_sum(NumericVector doy, NumericVector rainfall, double plant_date, double stage1, double stage2, double stage3) { double sum_rain_stage1(n); double sum_rain_stage2(n); double sum_rain_stage3(n); double mean_rain_stage1(n); double mean_rain_stage2(n); double mean_rain_stage3(n); # This part I do not know how to sum/average rainfall from plant_date to stage1, stage1 to stage2 and stage2 to stage3 } return Rcpp::List::create(Rcpp::Named("sum_rain_stage1") = sum_rain_stage1, Rcpp::Named("sum_rain_stage2") = sum_rain_stage2, Rcpp::Named("sum_rain_stage3") = sum_rain_stage3, Rcpp::Named("mean_rain_stage1") = mean_rain_stage1, Rcpp::Named("mean_rain_stage2") = mean_rain_stage2, Rcpp::Named("mean_rain_stage3") = mean_rain_stage3); } ,然后使用loginRequestAction()处理(请检查下面的redux-saga文件),如果一切正常,我将调度{{ 1}}操作。

我在这里想做的是找到一种方法来订阅我的React组件中的saga.js操作,因此一旦收到该操作,我就可以更新我的React组件的本地状态并使用LOGIN_REQUEST_SUCCESS来重定向用户到仪表板页面。

这是我的组件代码:

LOGIN_REQUEST_SUCCESS

这是我的saga.js文件:

history.push()

P.S。我来自这个GitHub问题:https://github.com/react-boilerplate/react-boilerplate/issues/2360(请看一下它,因为有可能的解决方案,但是恕我直言,我认为这不是正确的选择)。

2 个答案:

答案 0 :(得分:3)

通常,您永远不会“订阅”组件中的Redux操作,因为它破坏了React的一些声明性好处。在大多数情况下,您只会通过props connect()进入Redux状态,然后根据这些对象进行渲染。订阅操作,然后响应响应调用路由函数是强制性编程,而不是声明性编程,因此您需要避免在组件内使用。

因此,在使用Sagas时,您可以针对这种情况选择两个选项。除了从传奇中发出LOGIN_REQUEST_SUCCESS之外,您还可以从传奇本身内部推送一条新路线:

yield call(push, '/foo')

或者在您的Redux状态下保持authenticated: boolean属性,在用户登录时将其翻转到true中,然后使用它有条件地渲染反应路由器{{1} }(或者有条件地呈现应用程序的整个经过身份验证的树,直到您自己为止)。

答案 1 :(得分:1)

说实话,我认为github中的答案很有意义。您可以通过使用reducer在redux中预订分派操作。而reducer负责设置redux状态,并通过使用connect函数将其返回到您的组件。

从我的角度来看,添加一个名为“ loginSuccess”或其他内容的标记属性并将其传递给您不会导致性能问题,因为这是redux与react一起工作的方式