在阅读 Redux 的一个教程时,我遇到了这个警告:“Redux 操作和状态应该只包含简单的 JS 值,如对象、数组和基元。不要放置类实例、函数或其他不可序列化的值进入 Redux!”
这是否意味着类实例数组不应该保存在 redux 中?例如,假设我有一个聊天应用程序。假设我有一个 Conversation 类,其中包含参与者数组、消息数组、id 等。我可以向 redux 添加 Conversation 实例数组吗?
如果没有,为什么? React 应用程序的数据模型不应该过多依赖类和继承吗?
技术上可以做到这一点,但是你不应该将类实例添加到 Redux 状态!。 React 和 Redux 都希望您使用纯 JS 对象、数组和原语来表示状态,而不是类实例。
他们还希望您一成不变地更新该数据不依赖于继承。
也就是说,当你使用类作为值对象(这意味着它们是不可变的)并且没有继承时,它并不违背 React 的精神,而且看起来很好。
但是,文档中并不清楚“可以破坏存储内容的持久性和再水合能力”是什么意思。例如,当您使用reducer存储此类的实例,然后使用选择器检索它时,它是否会以某种方式进行转换(我的意思是序列化和反序列化)?如果没有,那就没问题,因为它可以使用。如果是,序列化/反序列化器将不知道如何(反)序列化它,因为 JS 没有任何通用的 Serialized 接口来实现哪个序列化器可以遵循。这样一来,使用类就无法使用了。
只是一个普通旧 JavaScript 对象 (POJO):
var obj = {};// this is a POJO
var obj = new Object();// this is POJO
什么不是 PJOJ,是这样的:
var Obj = function(welcome_text) {
this.welcome_text = welcome_text;
}
var c = new Obj("Welllllcome!!!!");// this is not a POJO !
我跟踪了 redux 的文档,他们在这个link
中给出了一个例子。他们解释说,例如,您不能将 new Date()
作为操作/状态的参数,因为 new Date() 将返回非 POJO !相反,您应该执行
new Date().toISOString()
,它将返回一个字符串。因此,回答您的直接问题(我可以添加到 redux 对话实例数组吗?)
是的,你可以。