Реагируйте на 16 контекстных API, есть ли способ получить список определенных контекстов? - PullRequest
0 голосов
/ 05 марта 2019

Я пишу компонент-оболочку для границы ошибки рендеринга на стороне сервера.

Рендеринг на стороне сервера (SSR) выполняется с использованием renderToString. Строка html может быть отправлена ​​на клиентскую сторону и повторно обработана для создания полного пользовательского интерфейса с обработчиками событий и тому подобным.

Границы ошибок на стороне клиента уже предоставлены в реакции (но они не работают в SSR): https://reactjs.org/docs/error-boundaries.html

Механизм границы ошибок, который я использую, похож на тот, который реализован здесь zekchan (zekchan использовал более старую версию контекстов реагирования вместо 16.x API): https://github.com/zekchan/react-ssr-error-boundary

Основная идея заключается в том, что вы хотите попробовать / поймать вокруг рендера. Единственный способ заставить его работать - это вызвать renderToString, который возвращает HTML в виде строки. Чтобы поместить html в родительский компонент, вы должны dangerouslySetInnerHTML, передав только что обработанную строку.

Проблема контекста заключается в том, что если какой-либо контекст используется дочерними элементами, то он должен быть указан в renderToString, как если бы он был корнем страницы. Компонент оболочки должен использовать все контексты, а затем внутри содержимого renderToString он должен создать нового поставщика для каждого контекста.

См. React docs в контексте: https://reactjs.org/docs/context.html

Контекст создается с использованием поставщика и потребителя. Поставщик оборачивает дочерние элементы и делает контекст доступным для этого поддерева. Потребитель - это ребенок где-то в поддереве, который обращается к контексту как опора.

В приложении имеется несколько провайдеров контекста, таких как StaticRouter в реаги и Provider из реакт-редукса.

То, что я хочу сделать, это получить список объектов контекста (откуда-то), чтобы я мог уменьшить список, составляя обертки провайдера или обертки потребителя для контекста.

Я не уверен, существует ли где-нибудь список контекстов или есть метод, который я мог бы использовать для их перечисления. Я мог бы, вероятно, выяснить вручную, какие контексты используются в моем приложении, но я хотел бы сделать это более общее решение для случая, чтобы позволить границе ошибки SSR быть перенесенной в другое приложение без какого-либо предварительного знания его контекстов.

[править] Беглый взгляд на исходный код реагирует, показывает, что нигде в реакторе не хранится список контекстов. https://github.com/facebook/react/blob/master/packages/react/src/ReactContext.js Сам объект контекста возвращается в код пользователя и передается туда, где это необходимо. Таким образом, контексты, созданные библиотеками, должны быть экспортированы этими библиотеками для использования таким образом. Можно обернуть createContext функцией для захвата его возвращаемых значений, но это глупо. [/ Править]

...