#reactjs #relayjs #relay
#reactjs #relayjs #реле
Вопрос:
Я прочитал документацию, и меня все еще смущает разница между политикой выборки «хранилище и сеть» и «только для сети».
«хранилище и сеть»: будет повторно использовать локально кэшированные данные и всегда будет отправлять сетевой запрос, независимо от того, отсутствовали ли какие-либо данные в локальном кэше или нет.
«только для сети»: не будет повторно использовать локально кэшированные данные и всегда будет отправлять сетевой запрос для извлечения запроса, игнорируя любые данные, которые могут быть локально кэшированы в Relay.
Я просто не могу понять, в чем смысл «хранилища и сети». В нем утверждается, что он «будет повторно использовать локально кэшированные данные»… но он ВСЕГДА извлекается из сети, так ЧТО ИМЕННО ТО, ЧТО он может использовать повторно?
В моем приложении я экспериментировал с обоими, и я нахожу нулевую разницу в поведении. Может ли кто-нибудь расширить это и, возможно, продемонстрировать сценарий, в котором «хранилище и сеть» и «только для сети» фактически возвращали бы разные результаты запроса?
Ответ №1:
Политики ретрансляционной выборки существуют для того, чтобы вы могли контролировать, что происходит, когда у вас устаревшие или отсутствующие данные.
Документы раскрывают эту концепцию здесь: https://relay.dev/docs/en/a-guided-tour-of-relay#presence-of-data
Однако, чтобы подвести итог:
- Недостающие данные: мусор ретрансляции собирает данные в хранилище, когда обнаруживает, что определенная часть данных больше нигде не отображается. Это обрабатывается различными способами, но обычно связано с монтированием / размонтированием компонентов, которые поддерживают (редактируют) ссылку на конкретный фрагмент или запрос. Как только Relay обнаруживает, что в хранилище нет активной ссылки на некоторые данные, он планирует эти данные для сбора мусора.
- Устаревшие данные: данные все еще могут быть устаревшими, но не запланированы для сборки мусора. Это тот случай, когда данные не «отсутствуют» (как в # 1), а просто нуждаются в обновлении — вероятно, после мутации. Все еще есть ссылка на данные в хранилище через подключенный компонент.
С этим различием политика выборки «только для сети» будет буквально игнорировать кеш. Он не будет проверять, будут ли доступны данные, необходимые компоненту для визуализации; скорее, он всегда будет инициировать сетевой запрос и не зависит от наличия (или его отсутствия) или устаревания (или их отсутствия) данных в вашем хранилище, как если бы хранилище не существовало.
С другой стороны, политика выборки «хранилища и сети» чувствительна к наличию (или его отсутствию) или устареванию (или отсутствию) данных в вашем хранилище.
Он проверит, существуют ли данные, необходимые для отображения определенного компонента, в хранилище:
(a) если это произойдет, он выполнит рендеринг и попытается начать рендеринг дочернего дерева компонентов, которое пройдет аналогичный процесс проверки отсутствия данных;
(b) если в какой-либо момент рендеринга древовидный ретранслятор встречает компонент с требованиями к данным, которых нет в хранилище, компонент не может выполнить рендеринг, поэтому сетевой запрос всегда будет выполняться.
Итак, «хранилище и сеть» позволяет вам жестко контролировать, как будет отображаться дерево компонентов с различными требованиями к данным. Сетевой запрос будет выполняться всегда — политика выборки просто диктует, как реле должно обрабатывать рендеринг / приостановку рендеринга частей вашего поддерева компонентов, учитывая текущее состояние вашего хранилища.
В случае (b) хорошим примером может быть ситуация, когда вы объявили фрагмент, определяющий требования к данным компонента, который ранее был размонтирован, но который был совместно использован компонентом в другом месте вашего приложения. Недостающие данные = выполнение сетевого запроса приостановка рендеринга в мире ретрансляции.
Другими словами, политика выборки на самом деле зависит от того, как ваше приложение отображает, а не от того, как оно выполняет выборку.
Ответ №2:
После множества экспериментов я нашел ответ:
«только для сети» извлекает данные и не обновляет никаких значений в хранилище ретрансляции. Это не приведет к обновлению других фрагментов.
«хранилище и сеть» извлекает данные, а затем обновляет хранилище этими значениями. Это приведет к обновлению любых зависимых фрагментов, что затем приведет к отображению их компонентов.