在中继分页graphql上滚动时合并以前的数据

Posted

技术标签:

【中文标题】在中继分页graphql上滚动时合并以前的数据【英文标题】:merge previous data while scrolling on relay pagination graphql 【发布时间】:2021-05-30 13:42:27 【问题描述】:

我正在尝试使用中继式分页。但是,我在无限滚动时遇到了麻烦。当我滚动或加载下一组数据时,我只会获取当前数据,而不会将其合并到以前的数据中。我就是这样做的

cache.ts

import  InMemoryCache  from '@apollo/client';
import  relayStylePagination  from '@apollo/client/utilities';

const cache = new InMemoryCache(
  typePolicies: 
    Query: 
      fields: 
        conversation: relayStylePagination(),
      ,
    ,
  ,
);

export default cache;

对话查询

在我的例子中,像 first、after、before、last 这样的参数都在 params 对象中

export const CONVERSATION = gql`
  query conversation($channel: ShortId, $contact: ShortId, $params: ConnectionInput) 
    conversation(channel: $channel, contact: $contact, params: $params) 
      status
      data 
        pageInfo 
          ...PageInfo
        
        edges 
          cursor
          node 
            ...Communication
          
        
      
    
  
  $PAGE_INFO
  $COMMUNICATION
`;

对话.tsx

const [loadConversation,  data, fetchMore, networkStatus, subscribeToMore ] = useLazyQuery(
    CONVERSATION,
  );
useEffect(() => 
  isMounted.current = true;
  if (channelId && contactId) 
    loadConversation(
      variables: 
        channel: channelId,
        contact: contactId,
        params:  first ,
      ,
    );
  
  return () => 
    isMounted.current = false;
  ;
, [channelId, contactId, loadConversation]);

<React.Suspense fallback=<Spinner />>
  <MessageList messages=messages ? generateChatMessages(messages) : [] />
  hasNextPage && (
    <>
      <button
        type='button'
        ref=setButtonRef
        id='buttonLoadMore'
        disabled=isRefetching
        onClick=() => 
          if (fetchMore) 
            fetchMore(
              variables: 
                params: 
                  first,
                  after: data?.conversation?.data?.pageInfo.endCursor,
                ,
              ,
            );
          
        
      />
    </>
  )
</React.Suspense>

我能知道我错过了什么吗?

【问题讨论】:

【参考方案1】:

first, after, before, last 应声明为 conversation 的参数,而不是 params 的属性。

Apollo 合并之前的页面when the query arguments contain after/before

query conversation($channel: ShortId, $contact: ShortId, $after: String, $first: Int, $before: String, $last: Int) 
    conversation(channel: $channel, contact: $contact, after: $after, first: $first, before: $before, last: $last) 
    ...
    


【讨论】:

感谢您的回复。这意味着,没有办法扩展 relayStylePagination 以从 params 对象中获取参数? relayStylePagination 仅处理中继 cursor specification 中已知的参数。其他参数留给您。

以上是关于在中继分页graphql上滚动时合并以前的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 graphql-spqr、java 和 mongo 进行中继分页

我对中继和graphql解析方法感到困惑

使用 Mongoose 进行基于 GraphQL 游标的分页 [关闭]

如何从两个不同的中继连接中删除共享节点?

如何在现有 GraphQL 服务器上添加根和查看器查询以支持中继

使用 Apollo Server 模拟中继式分页