如何添加我的订阅数据以更新我之前的查询

Posted

技术标签:

【中文标题】如何添加我的订阅数据以更新我之前的查询【英文标题】:How to add my subscription data to update my previous query 【发布时间】:2021-03-21 16:57:18 【问题描述】:

我有一个查询和一个订阅,我想做的是将我的数据添加到上一个查询中,以便它显示完整列表。

我有一个query,它返回给我学生列表,我正在像下面这样在 UI 上呈现它

    function Test(props) 
    const  loading, data: dta  = useQuery(GETSTUDENTS);
    const  data: d  = useSubscription(GETSUBSTUDENTS, 
        onSubscriptionData: ( subscriptionData:  data  ) => 
            let fname = data.getSubStudent.fname;
            let lname = data.getSubStudent.lname;
            dta.getStudents.push( fname, lname );
        ,
    );

    return (
        <div className="">
            dta &&
                dta.getStudents.map((li) => 
                    <div>
                        <p>li.fname</p>
                        <p>li.lname</p>
                    </div>;
                )
        </div>
    );


export default Test;

但主要问题是上述问题没有更新缓存,所以当我更改路由并再次返回时,它只需要以前的数据。

所以我想知道什么是最好的方法,我也检查了subscribeToMore,但不知道如何实现它以及它如何与钩子一起工作。

我从订阅中获取了一些数据,在此基础上我想更改其他部分以便我可以使用 refetchQueries 我没有找到任何使用 qraphql 使用钩子(react-apollo-hooks)的好教程

【问题讨论】:

【参考方案1】:

首先,您可以只使用 useQuery 的池选项而不是订阅, 我建议你检查一下。 来自 Apollo 文档:

“在大多数情况下,您的客户不应使用订阅 与您的后端保持同步。相反,您应该轮询 间歇性地进行查询,或者在 用户执行相关操作。” Apollo subscription

如果您仍想使用订阅,我认为您应该使用 subscribeToMore 并在 apollo 缓存文件中更新您的缓存策略:

 const cache = new InMemoryCache(
  typePolicies: 
    Agenda: 
      fields: 
        tasks: 
          merge(existing = [], incoming: any[]) 
            return [...existing, ...incoming];
          ,
        ,
      ,
    ,
  ,
);

您可以在此处阅读更多信息:merge cahce

并查看该视频:youtube apollo cache

【讨论】:

你分享的链接我已经看到了,但我不知道你在那个new InMemoryCache 中做什么,你能用我上面的代码解释一下吗,我应该怎么做 你应该有一个带有 InMemoryCache conf 的文件,然后你需要用你的缓存初始化你的 apollo 客户端: const apolloClient = new ApolloClient( link: ..., cache: apolloCache, connectToDevTools: ..., ... ) 内存缓存,您可以定义如何合并调用,例如用户查询:typePolicies: 查询: fields: users: keyArgs: false, merge(existing : User[], 传入:User[]) return [...(existing || []), ...incoming] , , , , ,

以上是关于如何添加我的订阅数据以更新我之前的查询的主要内容,如果未能解决你的问题,请参考以下文章

我应该在哪个条带事件中更新我的数据库以授予订阅者访问权限

在我当前订阅结束之前升级到更高的订阅时,订阅如何工作?

XMPP + 发布订阅 + ajaxpush

更新客户的 Stripe 订阅以按比例分配订阅费用的金额(部分金额)

AWS Appsync 订阅未更新我的组件

SqlServer 可更新订阅升级字段队列数据丢失原因