从 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——这太过分了。当然,如果这只是为了弄湿你的脚并学习,一定要!只是不想让您认为您需要这些简单事物的复杂抽象。
我正在使用 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——这太过分了。当然,如果这只是为了弄湿你的脚并学习,一定要!只是不想让您认为您需要这些简单事物的复杂抽象。