我有一个非常简单的项目,您可以在以下位置找到:
https://codesandbox.io/s/issue-looping-between-last-2-routes-xhxu1
存档:/src/store/middlewares.ts
我有以下中间件:
import { Dispatch, Middleware, AnyAction } from "redux";
import { RootState } from "./rootReducer";
import { createStandardAction } from "typesafe-actions";
export const sendMessage = createStandardAction("message/SEND")<string>();
export const locationMiddleware: Middleware<
{},
RootState,
Dispatch<AnyAction>
> = store => next => action => {
if (action.type === "@@router/LOCATION_CHANGE") {
store.dispatch(sendMessage("BEFORE D-DAY")); // <--- THIS LINE IS CAUSING THE ISSUE
const result = next(action);
store.dispatch(sendMessage("AFTER D-DAY"));
return result;
} else {
return next(action);
}
};
export const messageMiddleware: Middleware<
{},
RootState,
Dispatch<AnyAction>
> = store => next => action => {
if (action.type === "message/SEND") {
console.log("Message: ", action.payload);
}
return next(action);
};
正如你所看到的,@@router/LOCATION_CHANGE
我每次发送两个动作,并在另一个中间件上捕获一条消息:messageMiddleware
然后我console.log
用它们做一个。这些操作在调用之前和之后调度:next(action)
。
我面临的问题是 line: store.dispatch(sendMessage("BEFORE D-DAY"));
。
启用该行后,您可以执行以下步骤来重现该问题:
- 在根位置打开应用程序(又名
Page 01
:) - 点击链接:
Page 02
- 点击链接:
Page 03
- 单击返回按钮(您将被重定向到
Page 02
:) - 单击后退按钮(您将被重定向到:
Page 03
,而不是Page 01
#FAIL#
)
请注意,后退按钮是下面的一个(不是浏览器的实际按钮):
另一方面,如果我取消注释我引用为问题的行,则单击后退按钮时,行为如预期:-> Page 02 -> Page 01
直截了当。
似乎这个中间件系统不喜欢在调用: 之前调度一个动作next(action)
。
关于如何以一种好的方式解决这种情况并在调用之前和之后继续记录操作的任何想法next(action)
?
要求:使用中间件。
谢谢!