graphql,如何按第一个节点名称进行过滤?
graphql, how to filter by the very first node name?
如果我有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" } })
的事情来检索 AllMyPluginNodes
节点下的所有 yml
文件,但是现在,我该怎么做呢?
MyName1Nodes (filter: { extension: { eq: "yml" } })
这显然有效,但我希望 MyName1Nodes
成为一个变量,这不是问题,因为我可以通过 createPages
上下文传递变量。问题是,一旦我有了这个变量,如果这是一个 "root" 或 "primary" 节点,我该如何使用它来查询 MyName1Nodes
?可能吗?
我可以做类似的事情
query($ext: String) {
MyName1Nodes (filter: { extension: { eq: $ext } })`
但是我不能这样做
query($ext: String, $name: String) {
$name (filter: { extension: { eq: $ext } })`
可以吗?
You can pass variables that can be queried via context.
The automatically created pages can receive context and use that as variables in their GraphQL queries.
在 gatsby-node.js
创建页面时,尝试将 name
字段添加到页面的上下文中。
createPage({
path: `/${ edge.node.uid }`,
component: postTemplate,
context: {
uid: edge.node.uid,
name: name
}
})
在上下文中后,您可以在 graphql 查询中查询 name
。
query PostByName($name: String!) {
allMyPosts(filter: { name: { eq: $name } }) {
edges {
node {
id
data
...
}
}
}
}
此外,您可以通过 pageContext
prop.
在您的模板中访问 name
import React from "react"
const Page = ({ pageContext }) => {
return <div>{pageContext.name}</div>
}
export default Page
无法在另一个查询中使用页面查询的结果。 Gatsby 在评估页面之前通过静态分析提取您的 GraphQL 查询,因此变量不可用。这对于允许您的网站编译为不依赖 GraphQL 服务器 运行ning 的静态服务器端呈现页面很重要(在构建期间仅 运行ning)。
如果您想根据 GraphQL 查询的结果生成页面或其他效果,您可以按照@ksav 上面概述的那样做:运行一个查询(或几个)在 createPages
内,然后为它们中的每一个调用 createPage
,将结果 name
作为上下文传递,允许它在页面查询中用作变量.
如果我有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" } })
的事情来检索 AllMyPluginNodes
节点下的所有 yml
文件,但是现在,我该怎么做呢?
MyName1Nodes (filter: { extension: { eq: "yml" } })
这显然有效,但我希望 MyName1Nodes
成为一个变量,这不是问题,因为我可以通过 createPages
上下文传递变量。问题是,一旦我有了这个变量,如果这是一个 "root" 或 "primary" 节点,我该如何使用它来查询 MyName1Nodes
?可能吗?
我可以做类似的事情
query($ext: String) {
MyName1Nodes (filter: { extension: { eq: $ext } })`
但是我不能这样做
query($ext: String, $name: String) {
$name (filter: { extension: { eq: $ext } })`
可以吗?
You can pass variables that can be queried via context.
The automatically created pages can receive context and use that as variables in their GraphQL queries.
在 gatsby-node.js
创建页面时,尝试将 name
字段添加到页面的上下文中。
createPage({
path: `/${ edge.node.uid }`,
component: postTemplate,
context: {
uid: edge.node.uid,
name: name
}
})
在上下文中后,您可以在 graphql 查询中查询 name
。
query PostByName($name: String!) {
allMyPosts(filter: { name: { eq: $name } }) {
edges {
node {
id
data
...
}
}
}
}
此外,您可以通过 pageContext
prop.
name
import React from "react"
const Page = ({ pageContext }) => {
return <div>{pageContext.name}</div>
}
export default Page
无法在另一个查询中使用页面查询的结果。 Gatsby 在评估页面之前通过静态分析提取您的 GraphQL 查询,因此变量不可用。这对于允许您的网站编译为不依赖 GraphQL 服务器 运行ning 的静态服务器端呈现页面很重要(在构建期间仅 运行ning)。
如果您想根据 GraphQL 查询的结果生成页面或其他效果,您可以按照@ksav 上面概述的那样做:运行一个查询(或几个)在 createPages
内,然后为它们中的每一个调用 createPage
,将结果 name
作为上下文传递,允许它在页面查询中用作变量.