React 16上下文API,有没有办法获取已定义上下文的列表?

时间:2019-03-05 17:22:49

标签: reactjs error-handling serverside-rendering

我正在为服务器端呈现错误边界编写包装器组件。

服务器端渲染(SSR)使用renderToString完成。可以将html字符串发送到客户端,并使用事件处理程序等将其重新水化以构建完整的ui。

react中已经提供了客户端错误边界(但它们在SSR中不起作用):https://reactjs.org/docs/error-boundaries.html

我使用的错误边界机制与zekchan在此处实现的机制类似(zekchan使用了较早版本的react上下文而不是16.x API):https://github.com/zekchan/react-ssr-error-boundary

基本思想是您想要在渲染周围尝试/捕捉。使其起作用的唯一方法是调用renderToString,它将返回html作为字符串。要将html放入父组件中,您必须dangerouslySetInnerHTML,传递刚渲染的字符串。

上下文问题是,如果子级正在使用任何上下文,则必须在renderToString中提供它,就像它是页面的根一样。包装器组件必须使用所有上下文,然后在renderToString内容中,它必须为每个上下文创建一个新的提供程序。

有关上下文,请参见React文档:https://reactjs.org/docs/context.html

使用提供者和使用者完成上下文。提供程序包装子元素,并使上下文可用于该子树。消费者是子树中某个子节点的孩子,可以作为道具访问上下文。

应用程序中有多个上下文提供程序,例如react中的StaticRouter和react-redux中的Provider

我想做的是(从某处)获取上下文对象列表,以便减少列表,为上下文组成提供程序包装程序或消费者包装程序。

我不确定是否在某处维护了上下文列表,或者是否有可以用来枚举它们的技术。我可能可以手动找出应用程序中正在使用的上下文,但是我想使它成为更通用的解决方案,以允许将SSR错误边界放到另一个应用程序中而无需任何上下文信息。

[编辑] 粗略地浏览一下react源代码表明,react中没有存储任何上下文的列表。 https://github.com/facebook/react/blob/master/packages/react/src/ReactContext.js 上下文对象本身返回给用户代码,并传递到需要的任何地方。因此,由库创建的上下文需要由这些库导出才能以这种方式使用。可以将createContext与一个函数包装起来以捕获其返回值,但这很麻烦。 [/ edit]

0 个答案:

没有答案