Могу ли я использовать курсор разбиения на страницы graphql в качестве уникального идентификатора?

#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, это блестящее и очень информативное объяснение. Честно говоря, я не знал о таких технических нюансах, касающихся курсоров. Я очень ценю эту информацию.