我正在为服务器端呈现错误边界编写包装器组件。
服务器端渲染(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]