#javascript #pagination #graphql #apollo-client
Вопрос:
Основной вопрос в основном в теме, но я хотел бы описать проблему немного подробнее.
Я работаю над разбиением на страницы Apollo graphql, которое основано на курсоре, и в моем кэше я должен определить функцию слияния для объединения существующих и входящих данных. Каждый объект данных имеет общую структуру разбиения на страницы graphql:
{
"totalCount": ...,
"pageInfo": {
"startCursor": "...",
"endCursor": "...",
"hasNextPage": true,
"__typename": "..."
},
"edges": [...],
}
Мне нужно переопределить существующие данные, такие как: pageInfo, totalCount и т. Д., Теми же свойствами из входящих, но в случае ребер мне нужно тщательно объединить существующие и входящие элементы. Чтобы сделать его более элегантным и избежать дублирования, я хотел бы повторить входящие элементы и проверить, уникальны ли все элементы. например, если существующие ребра не содержат элементов, которые существуют во входящих.
Поэтому мне интересно, могу ли я использовать курсор разбиения на страницы graphql, который существует в каждом узле, в качестве аргумента сравнения. Я знаю, что могу использовать идентификатор элемента, но если можно также использовать значение курсора, я мог бы избежать использования более глубокого уровня свойств элемента края
Вот пример структуры данных:
{
"listArticles": {
"totalCount": 22,
"pageInfo": {
"startCursor": "NjE2N2ZlMmI4N2NiNDczMGY0N2U5MGQ5",
"endCursor": "NjE2ZDkzYTg0NDA5MWYyN2E0MmFkMGM5",
"hasNextPage": true,
"__typename": "PageInfo"
},
"edges": [
{
"cursor": "NjE2N2ZlMmI4N2NiNDczMGY0N2U5MGQ5",
"node": {
"id": "6167fe2b87cb4730f47e90d9",
"commentsThreadId": "6167fe2b87cb4730f47e90d8",
"__typename": "Article"
},
"__typename": "ArticleEdge"
},
{
"cursor": "NjE2ZDkzYTg0NDA5MWYyN2E0MmFkMGM5",
"node": {
"id": "616d93a844091f27a42ad0c9",
"commentsThreadId": "616d93a844091f27a42ad0c8",
"__typename": "Article"
},
"__typename": "ArticleEdge"
},
],
"__typename": "ArticleConnection"
}
}
Спасибо за любую помощь!
Ответ №1:
Я бы не рекомендовал использовать курсоры в качестве уникальных идентификаторов, хотя они могут в конечном итоге однозначно идентифицировать узлы. Их следует просто использовать для того, чем они являются: непрозрачные строки, используемые для поиска узлов внутри страниц.
Насколько я знаю, в зависимости от их реализации два узла не могут совместно использовать один и тот же курсор, но для одного и того же узла можно использовать два курсора.
Я бы просто пошел «на один уровень глубже» и использовал фактические идентификаторы элементов.
Комментарии:
1. Спасибо @sp00m, это блестящее и очень информативное объяснение. Честно говоря, я не знал о таких технических нюансах, касающихся курсоров. Я очень ценю эту информацию.