首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React-Apollo:使用变量查询导致UI不再乐观

React-Apollo:使用变量查询导致UI不再乐观
EN

Stack Overflow用户
提问于 2019-03-25 00:01:17
回答 1查看 553关注 0票数 0

我正在使用Apollo GraphQL编写一个React组件(使用React Apollo Hooks,但这没有什么区别)。

下面是我的问题:

代码语言:javascript
复制
const { data, error, loading } = useQuery(ListContacts, {
  fetchPolicy: 'cache-and-network'
  // variables: { limit: 1000 }
});

下面是我的函数,它进行了变异:

代码语言:javascript
复制
const createContact = useMutation(gql(mutations.createContact));
const deleteContact = useMutation(gql(mutations.deleteContact));
const updateContact = useMutation(gql(mutations.updateContact));

async function handleContactSave(contact) {
  const isEmpty = allStringFieldsAreEmptyFromContact(contact);
  const { id, ...processedContact } = replaceEmptyStringsWithNull(contact);
  const idIsInArray = includesContactWithId(id)(contacts);

  try {
    if (isEmpty) {
      if (idIsInArray) {
        await deleteContact({
          variables: { input: { id } },
          optimisticResponse: () => ({ deleteContact: { id } }),
          update: (cache, { data: { deleteContact } }) => {
            const query = ListContacts;
            const data = cache.readQuery({ query });
            data.listContacts.items = data.listContacts.items.filter(
              item => item.id !== deleteContact.id
            );
            cache.writeQuery({ query, data });
          }
        });
      }
    } else {
      if (idIsInArray) {
        await updateContact({
          variables: { input: { id, ...processedContact } },
          optimisticResponse: () => ({
            updateContact: { __typename: 'Contact', id, ...processedContact }
          }),
          update: (cache, { data: { updateContact } }) => {
            const query = ListContacts;
            const data = cache.readQuery({ query });
            data.listContacts.items = [
              ...data.listContacts.items.filter(
                item => item.id !== updateContact.id
              ),
              updateContact
            ];
            cache.writeQuery({ query, data });
          }
        });
      } else {
        await createContact({
          variables: { input: { ...processedContact } },
          optimisticResponse: () => ({
            createContact: {
              __typename: 'Contact',
              id: uuid(),
              ...processedContact
            }
          }),
          update: (cache, { data: { createContact } }) => {
            const query = ListContacts;
            const data = cache.readQuery({ query });
            data.listContacts.items = [
              ...data.listContacts.items.filter(
                item => item.id !== createContact.id
              ),
              createContact
            ];
            cache.writeQuery({ query, data });
          }
        });
      }
    }
  } catch (error) {
    console.log(error);
  }
}

一旦我用limit注释掉了variables键,UI就不再乐观地更新了。如果将值注释掉,就会发生这种情况。这里出了什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 00:15:41

writeQuery方法还接受variables值。阿波罗将queryvariables的每一个组合视为一个单独的查询。因此,如果一个Query组件(或挂钩)使用限制为100,而另一个使用限制为50,那么在编写update函数时,您将需要为这两个查询调用writeQuery,每次都为variables传递一个不同的值:

代码语言:javascript
复制
cache.writeQuery({ query, data, variables: { limit: 100 } })
cache.writeQuery({ query, data, variables: { limit: 50 } })

这是一个know limitation of the client。实际上,您需要通过本地状态跟踪变量,以便在调用update函数时正确调用writeQuery。可以理解,这可能是一个巨大的麻烦。幸运的是,您可以利用apollo-link-watched-mutation来解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55325696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档