从 redux-observable 史诗中访问状态

Accessing the state from within a redux-observable epic

我正在使用 redux 来 uild fusball-manager。基本上它是一个页面,显示两个团队的分数和一些按钮来增加它们。我有像 { type:"GOAL_UP", team:"red" } 这样的操作,reducer 将为此更改状态中的相应值(分数)。

现在我想添加一个史诗,每当它遇到 GOAL_UP 检查两支球队中的一支是否赢得了比赛。如果一个团队已经达到 8 分,我希望它发送一个 GAME_WON 动作。我的问题是我必须访问状态才能知道每支球队的得分。我找不到从史诗中访问状态的方法。

访问状态是否超出了 redux-observable 的范围?如果是这样,你会如何解决这个问题?

我正在考虑在 GOAL_UP 操作中将新分数作为 属性。像这样 { type:"GOAL_UP", team:"red", newScore:8 }。但不知何故,这感觉不对。我在 fusball-table 上还有两个物理按钮,它们与 Web 套接字相连,用于调度 GOAL_UP 操作。因为它们不是由我的 ui 触发的,所以它们不知道状态。

我还可以考虑在我的 ui 组件的渲染函数中调度 GAME_WON 操作,如果任何一个团队的分数是 8。但这感觉更不对:)

非常欢迎输入,谢谢

查看 redux-observable 文档的 Accessing the Store's State 部分。

它描述了除了动作流(第一个参数)之外,您的epics如何接收商店状态流(第二个参数)。

使用state$.value同步访问当前状态。该值将包含您的整个 redux 存储状态。

请注意,当一个动作到达您的史诗时,它 已经 通过您的减速器 运行 (并且任何状态已更新)。

const INCREMENT = 'INCREMENT';
const INCREMENT_IF_ODD = 'INCREMENT_IF_ODD';

const increment = () => ({ type: INCREMENT });
const incrementIfOdd = () => ({ type: INCREMENT_IF_ODD });

const incrementIfOddEpic = (action$, state$) =>
  action$.ofType(INCREMENT_IF_ODD)
    .filter(() => state$.value.counter % 2 === 0)
    .map(increment);

// later...
dispatch(incrementIfOdd());

我还要补充一点,如前所述,我认为您不需要 redux-observable 甚至不需要 redux——这太过分了。当然,如果这只是为了弄湿你的脚并学习,一定要!只是不想让您认为您需要这些简单事物的复杂抽象。