Gatsby Source Contentful 4.x - 富文本 - 更改为 JSON
Gatsby Source Contentful 4.x - Rich Text - changes to JSON
我正在尝试从 Contentful 获取富文本,但在 4.x 版本的 gatsby-source-contentful 中,文档似乎不再更新。指的是json,但是已经变成raw了,就是不知道怎么继续了。
这是我的代码:
import React from "react"
import { graphql, Link } from "gatsby"
import { documentToReactComponents } from "@contentful/rich-text-react-renderer"
import Layout from "../components/layout/layout"
import Img from "gatsby-image"
import SEO from "../components/layout/seo"
export const query = graphql`
query($slug: String!) {
contentfulBlogPost(slug: { eq: $slug }) {
title
publishedDate(formatString: "Do MMMM, YYYY")
featuredImage {
fluid(maxWidth: 750) {
...GatsbyContentfulFluid
}
}
body {
json
}
}
}
`
const BlogPost = props => {
const options = {
renderNode: {
"embedded-asset-block": node => {
const alt = node.data.target.fields.title["en-US"]
const url = node.data.target.fields.file["en-US"].url
return <img alt={alt} src={url} />
},
},
}
return (
<Layout>
<SEO title={props.data.contentfulBlogPost.title} />
<Link to="/blog/">Visit the Blog Page</Link>
<div className="content">
...
{props.data.contentfulBlogPost.featuredImage && (
<Img
className="featured"
fluid={props.data.contentfulBlogPost.featuredImage.fluid}
alt={props.data.contentfulBlogPost.title}
/>
)}
{documentToReactComponents(
props.data.contentfulBlogPost.body.json,
options
)}
</div>
</Layout>
)
}
export default BlogPost
如果您查看下面的部分,我相信这就是错误所在。我收到的错误消息是“无法在类型“ContentfulBlogPostBody”上查询字段“json”。但是如果我将其更改为原始而不是 json,它不会给我任何错误,但它不显示富文本(正文):
}
body {
json
}
}
}
`
以下是如何在 Contentful 设置内容模型的屏幕截图:
Contentful - Content Model
如何使用更新版本的 gatsby-source-contentful(当前版本为 4.2.1)并改变其处理富文本的方式?
您可以找到如何使用 raw
in the documentation for gatsby-source-contentful.
的示例
这是使用富文本查询的样子:
{
allContentfulBlogPost {
edges {
node {
bodyRichText {
raw
references {
... on ContentfulAsset {
contentful_id
__typename
fixed(width: 1600) {
width
height
src
srcSet
}
}
... on ContentfulBlogPost {
contentful_id
__typename
title
slug
}
}
}
}
}
}
}
你可以像这样使用它。
import { BLOCKS, MARKS } from "@contentful/rich-text-types"
import { renderRichText } from "gatsby-source-contentful/rich-text"
const Bold = ({ children }) => <span className="bold">{children}</span>
const Text = ({ children }) => <p className="align-center">{children}</p>
const options = {
renderMark: {
[MARKS.BOLD]: text => <Bold>{text}</Bold>,
},
renderNode: {
[BLOCKS.PARAGRAPH]: (node, children) => <Text>{children}</Text>,
[BLOCKS.EMBEDDED_ASSET]: node => {
return (
<>
<h2>Embedded Asset</h2>
<pre>
<code>{JSON.stringify(node, null, 2)}</code>
</pre>
</>
)
},
},
}
function BlogPostTemplate({ data, pageContext }) {
const { bodyRichText } = data.contentfulBlogPost
return <div>{bodyRichText && renderRichText(bodyRichText, options)}</div>
}
我正在尝试从 Contentful 获取富文本,但在 4.x 版本的 gatsby-source-contentful 中,文档似乎不再更新。指的是json,但是已经变成raw了,就是不知道怎么继续了。
这是我的代码:
import React from "react"
import { graphql, Link } from "gatsby"
import { documentToReactComponents } from "@contentful/rich-text-react-renderer"
import Layout from "../components/layout/layout"
import Img from "gatsby-image"
import SEO from "../components/layout/seo"
export const query = graphql`
query($slug: String!) {
contentfulBlogPost(slug: { eq: $slug }) {
title
publishedDate(formatString: "Do MMMM, YYYY")
featuredImage {
fluid(maxWidth: 750) {
...GatsbyContentfulFluid
}
}
body {
json
}
}
}
`
const BlogPost = props => {
const options = {
renderNode: {
"embedded-asset-block": node => {
const alt = node.data.target.fields.title["en-US"]
const url = node.data.target.fields.file["en-US"].url
return <img alt={alt} src={url} />
},
},
}
return (
<Layout>
<SEO title={props.data.contentfulBlogPost.title} />
<Link to="/blog/">Visit the Blog Page</Link>
<div className="content">
...
{props.data.contentfulBlogPost.featuredImage && (
<Img
className="featured"
fluid={props.data.contentfulBlogPost.featuredImage.fluid}
alt={props.data.contentfulBlogPost.title}
/>
)}
{documentToReactComponents(
props.data.contentfulBlogPost.body.json,
options
)}
</div>
</Layout>
)
}
export default BlogPost
如果您查看下面的部分,我相信这就是错误所在。我收到的错误消息是“无法在类型“ContentfulBlogPostBody”上查询字段“json”。但是如果我将其更改为原始而不是 json,它不会给我任何错误,但它不显示富文本(正文):
}
body {
json
}
}
}
`
以下是如何在 Contentful 设置内容模型的屏幕截图:
Contentful - Content Model
如何使用更新版本的 gatsby-source-contentful(当前版本为 4.2.1)并改变其处理富文本的方式?
您可以找到如何使用 raw
in the documentation for gatsby-source-contentful.
这是使用富文本查询的样子:
{
allContentfulBlogPost {
edges {
node {
bodyRichText {
raw
references {
... on ContentfulAsset {
contentful_id
__typename
fixed(width: 1600) {
width
height
src
srcSet
}
}
... on ContentfulBlogPost {
contentful_id
__typename
title
slug
}
}
}
}
}
}
}
你可以像这样使用它。
import { BLOCKS, MARKS } from "@contentful/rich-text-types"
import { renderRichText } from "gatsby-source-contentful/rich-text"
const Bold = ({ children }) => <span className="bold">{children}</span>
const Text = ({ children }) => <p className="align-center">{children}</p>
const options = {
renderMark: {
[MARKS.BOLD]: text => <Bold>{text}</Bold>,
},
renderNode: {
[BLOCKS.PARAGRAPH]: (node, children) => <Text>{children}</Text>,
[BLOCKS.EMBEDDED_ASSET]: node => {
return (
<>
<h2>Embedded Asset</h2>
<pre>
<code>{JSON.stringify(node, null, 2)}</code>
</pre>
</>
)
},
},
}
function BlogPostTemplate({ data, pageContext }) {
const { bodyRichText } = data.contentfulBlogPost
return <div>{bodyRichText && renderRichText(bodyRichText, options)}</div>
}