热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GraphQL查询Gatsby-具有灵活内容模型的内容丰富的设置

如何解决《GraphQL查询Gatsby-具有灵活内容模型的内容丰富的设置》经验,为你挑选了1个好方法。

我有一个gatsby网站,其中包含内容丰富的插件graphql查询(安装程序正在运行)。

[编辑]我的gatsby安装程序使用pageCreate功能动态提取数据。并填充我的模板组件,这是我在下面共享的根graphql查询。如果有内容的页面遵循以下查询中给出的结构,则可以使用安装程序创建多个页面。[/编辑]

我的问题是我似乎遇到了一个限制,或者只是不了解足够的grpahql来理解这一限制。

我的高级内容模型“ BasicPageLayout”包含通过“部分”字段对其他内容类型的引用。因此,在“ BasicPageLayout”中包含哪些内容类型以及添加顺序方面,它很灵活。

根页查询

export const pageQuery = graphql`
query basicPageQuery {
contentfulBasicPageLayout(pageName: {eq: "Home"}) {

    heroSection {
        parent {
            id
        }
        ...HeroFields
    }

    section1 {
        parent {
            id
        }
        ...ContentText

    }

    section2 {
        parent {
            id
        }
        ...ContentTextOverMedia
    }

    section3 {
        parent {
            id
        }
        ...ContentTextAndImage
    }

    section4 {
        parent {
            id
        }
        ...ContentText
    }
  }
}

内容类型的片段全部都存在于相应的UI组件中。上面的查询和设置正在运行。

现在,我已经对“ Home”进行了硬编码,因为在创建灵活的可重用查询时遇到了麻烦。在创建模型时,我利用了contentful的灵活性,但是还没有找到在graphql查询中创建这种灵活性的方法。

我所知道的: Graphql查询在运行时已解决,因此所有需要提取的内容都应该在该查询中。它不能是“动态的”。

问题: basicPageLayout中的“ Section”字段可以链接到任何内容类型。因此,我们可以混合和匹配粒度级别的内容类型。如何添加内容类型片段(如ContentTextAndImage与ContentText),使其适合该部分实例(查询中的“ Section”字段)?

换句话说, 我希望根查询获取“家”数据,该数据可能有4个部分,所有类型都是-ContentTextOverMedia,而“关于”数据可能也有4个部分,但类型交替-ContentText和ContentTextAndImage

这是目标,因为我想通过在内容上混合匹配内容类型来创建内容(页面),而无需每次创建新页面时都更新代码。这就是为什么Contentful有用并且首先被选中的原因。

到目前为止,我的想法是:

A.依次运行两个查询。一个在每个节上获取parent.id,并保存内容类型信息。其次,使用适当的片段获取数据。

B.通过Contentful API分别获取basicPageLayouts内容实例的JSON文件(例如“ Home”),然后使用该JSON文件创建要在每个实例中使用的graphql字符串(因此,Home,About等的布局不同)上),这需要更多的实验,不确定是否可行,也可能比需要的更复杂。

因此,请就我正在探索的上述路径或我未考虑使用graphql或gatsby功能的其他解决方案分享想法。

顺便说一句,这是我的第一个问题,我花了一些时间对其进行完善并尝试遵循指南,但是请务必在评论中给我反馈,以便即使您对我的问题没有答案也可以改善。提前致谢。



1> Khaled Garba..:

如果我正确理解,您想根据Contentful的数据动态创建页面。

您可以使用Gatsbyjs Node API专门实现此目的createPage

在您的gatsby-node.js文件中,您可以有这样的内容

const fs = require('fs-extra')
const path = require('path')

exports.createPages = ({graphql, boundActionCreators}) => {
  const {createPage} = boundActionCreators
  return new Promise((resolve, reject) => {
    const landingPageTemplate = path.resolve('src/templates/landing-page.js')
    resolve(
      graphql(`
        {
          allContentfulBesicPageLayout {
            edges {
              node {
                pageName
              }
            }
          }
        }
      `).then((result) => {
        if (result.errors) {
          reject(result.errors)
        }
        result.data.allContentfulBesicPageLayout.edges.forEach((edge) => {
          createPage ({
            path: `${edge.node.pageName}`,
            component: landingPageTemplate,
            context: {
              slug: edge.node.pageName // this will passed to each page gatsby create
            }
          })
        })
        return
      })
    )
  })
}

现在在你的 src/templates/landing-page.js

import React, { Component } from 'react'
const LandingPage = ({data}) => {
    return (
Add you html here
) } export const pageQuery = graphql` query basicPageQuery($pageName: String!) { contentfulBasicPageLayout(pageName: {eq: $pageName}) { heroSection { parent { id } ...HeroFields } section1 { parent { id } ...ContentText } section2 { parent { id } ...ContentTextOverMedia } section3 { parent { id } ...ContentTextAndImage } section4 { parent { id } ...ContentText } } }

请注意$pageName创建页面时传递给组件上下文的参数。这样,您最终将创建所需的页面。请注意:代码的react部分尚未经过测试,但希望您能理解。

更新:要有一个灵活的查询,而不是让您的内容类型作为单个引用字段,您可以有一个名为sections的字段,并且可以按所需顺序在其中添加所需的部分。您的查询将如下所示

    export const pageQuery = graphql`
    query basicPageQuery($pageName: String!) {
    contentfulBasicPageLayout(pageName: {eq:  $pageName}) {
       sections {
         ... on ContentfulHeroFields {
           internal {
              type
        }
    }
}         

}

哈立德


推荐阅读
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
author-avatar
dmcm0005
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有