Навигация по дереву graphql-data с реагированием-навигацией - PullRequest
1 голос
/ 16 апреля 2020

TL; DR: Как мне подписать * компонент на ветку дерева, возвращенную из graphql?

Проблема

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

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

Текущая ситуация

В настоящее время ужасное решение состоит в том, чтобы отправлять данные в качестве параметров навигации, чтобы все было лучше. У нас было множество ошибок с несинхронизированными данными.

Решения

Потенциальное решение # 1

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

Другое потенциальное решение

Третье решение - поместить отдельные запросы для все слои дерева и, возможно, используют fetchPolicy='cache-only', но не каждый узел в дереве имеет идентификатор, а ** схема не имеет запросов для отдельных узлов. Если это произойдет, я думаю, что перенаправление кеша может предотвратить избыточные выборки.

Итак, я предполагаю, что реальный вопрос заключается в следующем: есть ли хороший способ извлечь данные из определенной c части дерева, возвращенной из graphql? Я знаю о client.readFragment, но тогда компонент не будет автоматически обновляться при изменении кеша. Может быть, использовать собственный распознаватель?

Еще одна возможность

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


* Не подписывайтесь, как в подписке GraphQL, просто убедитесь, что она синхронизирована c каждый раз, когда обновляется кеш Apollo, как это делает useQuery.

** Это не проблема, поскольку его легко устранить с помощью пользовательских идентификаторов в мой случай.

...