是否允许在 React 上下文中存储不可序列化的对象?

Posted

技术标签:

【中文标题】是否允许在 React 上下文中存储不可序列化的对象?【英文标题】:Is it allowed to store non serializable object in React context? 【发布时间】:2021-07-26 21:00:22 【问题描述】:

我无法在docs 中找到有关此问题的答案

我知道这在 redux 商店中被认为是一种不好的做法,请参阅 here。

您能否提供有关在上下文中使用不可序列化对象的任何参数或文档链接?

考虑下一个例子:

class A 
 foo=()=> void 0
 bar=()=> void 0


const context = React.createContext(new A()) // is this ok ?

【问题讨论】:

你能使用上下文吗?属性出现了吗? @evolutionxbox 当然,我只是好奇这是不是一个好方法 如果代码有效,那么答案是肯定的? 你可以序列化它。为什么你认为它不可序列化?因为它不包含自己的道具?它仍然是上下文 IMO 的有效对象。但是,正如您指出的那样,我认为这不是一个好习惯。该文档指出,上下文是共享被认为是全局的数据。如果您没有要共享的全局数据,那么使用上下文毫无意义。 好/坏的做法是意见吗? 【参考方案1】:

我认为在 React 上下文中存储不可序列化的对象是非常好的。这里有一些论点。

首先,我不知道(如果我错了,请纠正我)任何序列化或反序列化任意上下文和/或假设它是可序列化的内部反应机制。

其次,react context now 是一个稳定的特性(相比之下,它在前一段时间是不稳定的)。这里不太可能有什么变化,所以我们不需要主动小心。

最后,react context 只是一种将某些东西隐式传递到组件树的方法,而不是更多,也不是更少。 React 上下文实际上不是关于存储 的东西,它是关于提供消费 的东西。您不会将事物存储在上下文中,而是将其存储在其他地方,也许是状态,也许是某处,然后将其提供给消费者。那么,如果消费者需要,为什么不向他们提供功能呢?它与通过 props 传递事物有何不同(传递函数肯定不是反模式)?

更多的是关于具体场景,没有人比你更清楚如何以及何时限制特定的上下文形状。例如,在我们的项目中,我们有一些内部的类似 redux 的库,它通过 rpc 调用在电子窗口之间同步存储。它使用上下文,我们特别限制(使用打字稿)上下文形状是可序列化的(以便能够通过 rpc 传输它)。另一方面,我们有很多情况下我们通过上下文传递不可序列化的东西。

【讨论】:

以上是关于是否允许在 React 上下文中存储不可序列化的对象?的主要内容,如果未能解决你的问题,请参考以下文章

React:如何使用相同类型的多个上下文,同时允许孩子从所有上下文中读取数据

将对象存储在 React 组件的状态中?

React Hooks 有条件地渲染登录/注销 w/本地存储变量

HP Fortify:ASP.NET 不良做法:存储在会话中的不可序列化对象

React中的不可变性

扩展 django rest 框架以允许在嵌套序列化程序中继承上下文