如果我有graphQL
个节点,例如
allFile {
edges {
...
}
}
name1 {...}
name2 {...}
如何过滤name1
和name2
?
如果我可以将name1
作为变量传递,那么由于它们是第一个节点,我该怎么做?
换句话说,通常的方式是
allFile (filter: {extension: {eq: "jpg"} }){
edges {
nodes {
name
}
}
}
但是如果我想要类似的东西怎么办
(filter: {eq: "name1"}){
edges {
nodes {
name
}
}
}
或直接
query ($name: String) {
$name {
edges {
node {
name
message
}
}
}
}
但似乎不可能(?)
编辑
我会尽力解释自己。如果我有这棵树:
AllMyPluginNodes {
edges {
node {
name
我可以过滤具有特定扩展名(照常营业)的该节点的所有节点。
问题是“ AllMyPluginNodes”的名称正在更改,例如
MyName1Nodes {
edges {
...
MyName2Nodes {
edges {
...
MyName3Nodes {
edges {
...
我知道所有这些名称,所以我想专门查询这些名称。
在第一种情况下,我将执行类似AllMyPluginNodes(filter: { extension: { eq: "yml" } })
的操作来检索yml
节点下的所有AllMyPluginNodes
文件,但是现在,我该怎么做?
MyName1Nodes (filter: { extension: { eq: "yml" } })
这显然可行,但是我希望MyName1Nodes
是一个变量,这不是问题,因为我可以通过createPages
上下文传递变量。问题是,一旦有了此变量,如果这是一个“根”节点或“主”节点,如何使用它查询MyName1Nodes
?有可能吗?
我可以做类似的事情
query($ext: String) {
MyName1Nodes (filter: { extension: { eq: $ext } })`
但是我不能做这样的事情
query($ext: String, $name: String) {
$name (filter: { extension: { eq: $ext } })`
可以吗?
答案 0 :(得分:0)
You can pass variables that can be queried via context。
自动创建的页面可以接收上下文并将其用作其GraphQL查询中的变量。
在创建页面的&VecDeque
中,尝试将gatsby-node.js
字段添加到页面的上下文中。
name
在上下文中,您可以在graphql查询中查询createPage({
path: `/${ edge.node.uid }`,
component: postTemplate,
context: {
uid: edge.node.uid,
name: name
}
})
。
name
此外,您还可以通过query PostByName($name: String!) {
allMyPosts(filter: { name: { eq: $name } }) {
edges {
node {
id
data
...
}
}
}
}
属性访问模板中的name
。
pageContext
答案 1 :(得分:0)
无法在另一个查询中使用页面查询的结果。 Gatsby在评估页面之前通过静态分析提取您的GraphQL查询,因此变量不可用。这对于让您的网站编译为不依赖于GraphQL服务器运行(仅在构建期间运行)的静态服务器端渲染页面非常重要。
如果您要基于GraphQL查询的结果生成页面或其他效果,您可以按照@ksav概述的操作进行操作:在{{1}内运行一个(或多个)查询},然后针对它们中的每一个调用createPages
,将生成的createPage
作为上下文传递,使其可以在页面查询中用作变量。