我的应用程序中有一些操作类型,我已经这样声明了:
export const TICTACTOE_PLAY = Symbol();
export const TICTACTOE_RESET = Symbol();
然后我写了一些行动调度员这样:
export const play = coordinates => ({ type: TICTACTOE_PLAY, coordinates });
export const reset = () => ({ type: TICTACTOE_RESET });
我更喜欢符号而不是字符串,因为它们是原始的,我相信它们比字符串(在减速器中(更容易比较,而且它们不会相互碰撞。
然而,在Redux风格指南中,我读到这是一个反模式。然而,我不能完全理解这句话:
这确保了通过Redux进行调试等功能DevTools将按预期工作。它还确保UI按预期更新。
为什么像符号这样的不可序列化值会阻止Redux DevTools或UI按预期工作?我知道这可能无助于调试,我知道状态必须是可序列化的(对于服务器端渲染等用例(,但我不明白为什么操作必须是可串行的。
在您询问为什么它可能会破坏Redux DevTools的特定情况下,常见问题解答中似乎有一节是关于这一点的。
与state一样,可序列化操作启用了Redux的一些定义功能,如时间旅行调试以及记录和回放操作。对类型值使用Symbol之类的东西,或者对操作本身使用instanceof检查,都会打破这种局面。