嗨@user13680445,内容丰富的 Richtext 字段总是返回类似这样的内容,至少作为 Graphql 响应
"richTextResponse": {
// JSON structure of the Rich Text field
"json": {
# ...
}
// all referenced assets/entries
"links": {
# ...
}
}
在链接字段中,您将获得嵌入 Richtext 中的所有资产和条目
在这里,我在 Typescript 中有一个如何添加资产的示例
export const renderOptions = (links: Links): Options => {
const assetMap = getAssets(links.assets.block);
const entryMap = getEntries(links.entries.block);
return {
renderNode: {
[BLOCKS.HEADING_1]: renderHeading,
[BLOCKS.PARAGRAPH]: renderParagraph,
[BLOCKS.EMBEDDED_ENTRY]: renderEntry(entryMap),
[BLOCKS.EMBEDDED_ASSET]: renderAsset(assetMap),
},
};
};
const renderAsset =
(assetMap: Map<string, ContentfulImage>): NodeRenderer =>
(node) => {
const asset = assetMap.get(node.data.target.sys.id);
if (!asset) {
return <></>;
}
switch (asset.contentType) {
case "video/mp4":
return (
<VideoAsset
url={asset.url}
width={asset.width}
height={asset.height}
/>
);
case "image/png":
case "image/jpeg":
return (
<ImageAsset
url={asset.url}
width={600}
height={450}
description={asset.description}
quality={75}
/>
);
default:
return "Nothing to see here...";
}
};
然后您可以像这样调用该函数:
{documentToReactComponents(json, renderOptions(links))}
这是一种基本的方法,但目前 Contentful 没有更好的方法来做到这一点。
在那里,我们得到了与 nodeType 中的 sys.id 和资产链接中的 sys.id 匹配的资产数据,例如:
富文本对象
{
"nodeType": "embedded-asset-block",
"content": [],
"data": {
"target": {
"sys": {
"id": "2DdSHQJA8zoumehPzqWZrs",
"type": "Link",
"linkType": "Asset"
}
}
}
}
链接对象
"links": {
"assets": {
"block": [
{
"sys": {
"id": "2DdSHQJA8zoumehPzqWZrs"
},
"fileName": "GOPR0511.JPG",
"url": "https://images.ctfassets.net/",
"title": "GOPR0511"
}
]
}
}
我们基于 sys.id 连接两者,在这种情况下,是2DdSHQJA8zoumehPzqWZrs