您的方向是正确的,但有一些变化:
访问状态
而不是使用store
直接调用变量getState()
,您应该访问getState()
来自参数的函数effect
打回来。
effect: (action: Action, listenerApi: ListenerApi) => void | Promise<void>
Your effect
使用两个参数调用函数:action
触发了效果并且listenerApi
对象,它使您可以访问getState()
and 许多其他实用程序.
侦听器中间件不知道存储的 TypeScript 类型,因此您需要以某种方式使其知道。一种方法是使用内联as
的断言listenerApi.getState()
call.
listenerMiddleware.startListening({
actionCreator: increment,
effect: (action, listenerApi) =>
localStorage.setItem("count", JSON.stringify((listenerApi.getState() as RootState).counter))
});
您还可以按照TypeScript 用法文档部分并使用TypedStartListening
实用类型。
处理多个动作
您不需要多个侦听器中间件实例,因为您可以将多个侦听器附加到同一中间件。简单的调用startListening
同一件事上多次listenerMiddleware
多变的。
然而在这种情况下,一个startListening
只需致电即可!你们的两个案例已经有相同的effect
打回来。但我们需要能够匹配两者increment
and decrement
行动。有几种不同的方式侦听器可以检测到匹配的操作。而不是使用actionCreator
,它只能匹配一个动作,我们将使用matcher
财产。我们在以下的帮助下创建了一个匹配器函数isAnyOf utility.
我们最终的中间件如下所示:
import { createListenerMiddleware, isAnyOf } from "@reduxjs/toolkit";
import { decrement, increment } from "./slice";
import type { RootState } from "./index";
export const listenerMiddleware = createListenerMiddleware();
listenerMiddleware.startListening({
matcher: isAnyOf(increment, decrement),
effect: (action, listenerApi) =>
localStorage.setItem(
"count",
JSON.stringify((listenerApi.getState() as RootState).counter)
)
});
完整的 CodeSandbox 演示