gpt4 book ai didi

Apollo 链接状态默认解析器不工作(@client 查询参数变量)

转载 作者:行者123 更新时间:2023-12-01 10:21:52 25 4
gpt4 key购买 nike

此处示例:https://codesandbox.io/s/j4mo8qpmrw

此处的文档:https://www.apollographql.com/docs/link/links/state.html#default

TLDR:这是一个待办事项列表,@client 查询参数不会过滤掉列表。


这是查询,以 $id 作为参数

  const GET_TODOS = gql`
query todos($id: Int!) {
todos(id: $id) @client {
id
text
}
}
`;

查询在其中传递变量

<Query query={GET_TODOS} variables={{ id: 1 }}>

/* Code */

</Query>

但默认解析器不使用该参数,您可以在上面的 codesandbox.io 示例中看到它。

文档说它应该有效,但我似乎无法弄清楚我遗漏了什么。提前致谢!

最佳答案

对于简单的用例,您通常可以依赖 the default resolver获取您需要的数据。但是,要实现诸如过滤缓存中的数据或对其进行操作(就像对突变所做的那样)之类的操作,您需要编写自己的解析器。要完成您想要做的事情,您可以这样做:

export const resolvers = {
Query: {
todos: (obj, args, ctx) => {
const query = gql`
query GetTodos {
todos @client {
id
text
}
}
`
const { todos } = ctx.cache.readQuery({ query })
return todos.filter(todo => todo.id === args.id)
},
},
Mutation: {},
}

编辑:我们定义的每个类型都有一组字段。当我们返回一个特定的类型(或类型列表)时,该类型的每个字段将使用默认解析器来尝试解析它自己的值(假设该字段被请求)。默认解析器的工作方式很简单——它查看父(或“根”)对象的值,如果找到与字段名称匹配的属性,则返回该属性的值。如果未找到该属性(或无法强制转换为该字段期望的任何标量或类型),则返回 null。

这意味着我们可以,例如,返回一个表示单个 Todo 的对象,我们不必为其 idtext 字段定义解析器,因为只要该对象具有 idtext 属性。从另一个角度来看,如果我们想在 Todo 上创建一个名为 textWithFoo 的任意字段,我们可以保留缓存默认值,并创建一个像这样的解析器

(obj, args, ctx) => obj.text + ' and FOO!'

在这种情况下,默认解析器对我们没有好处,因为存储在缓存中的对象没有 textWithFoo 属性,因此我们编写自己的解析器。

要记住的重要一点是,像 todos 这样的查询也只是一个字段(在本例中,它是查询类型上的一个字段)。它的行为与任何其他字段的行为几乎相同(包括默认的解析器行为)。但是,对于 apollo-link-state,您在 defaults 下定义的数据结构将成为查询的父值或“根”值。

在您的示例代码中,您的默认值 包含一个属性 (todos)。因为这是根对象的一个​​属性,我们可以使用名为 todos 的查询来获取它,并且即使没有解析器也仍然可以取回数据。 todos 字段的默认解析器将查找根对象(在本例中为您的缓存),查看名为 todos 的属性并将其返回。

另一方面,像todo(单数)这样的查询在根(缓存)中没有匹配的属性。您需要为其编写解析器以使其返回数据。同样,如果您想在查询中返回数据之前对其进行操作(带或不带参数),则需要包含一个解析器。

关于Apollo 链接状态默认解析器不工作(@client 查询参数变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50498710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com