我试图弄清楚如何在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(请看一下它,因为有可能的解决方案,但是恕我直言,我认为这不是正确的选择)。
答案 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一起工作的方式