我正在处理Notion的API来获取地点及其相关城市的列表,然后通过一些组件渲染这些数据。我对JS世界(2023版)相当陌生,所以我在弄清楚什么是最好的组织方式方面遇到了一些麻烦。
这就是我在想的
/lib/api.js
在这里我通过SDK从Notion的API获取数据;由于返回的数据是相当自定义的格式,我Map了我感兴趣的每个属性并返回一个非常简化的对象。这里也会获取嵌套数据(每个地方的城市)。总之,这个文件中的函数应该返回如果它提供GraphQL API的话会返回的数据;/pages/[placeId].js
,我在getStaticProps
中调用上面文件中的相关函数,并从页面本身调用相关组件;/components/text.js
在这里我以一种更可组合的方式操作数据并呈现它
这一切都是有意义的,直到我发现一些概念响应包括渲染信息:
{
"type": "text",
"text": {
"content": "This is an ",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "This is an ",
"href": null
}
字符串
在这种情况下,解析它并在**/lib/api.js
中生成相应的HTML**会很奇怪。另一方面,如果我只是在/lib/api.js
中返回Notion的响应,我将不得不解析属性并从组件中请求嵌套的信息,这看起来也不太好。
如何用一种干净的、值得JS使用的方式来解决这个问题?如果有帮助的话,我可以提供更多的细节,我试着尽可能简短。
1条答案
按热度按时间ipakzgxi1#
在API中呈现html没有多大意义。最好的方法是在API响应中包含呈现信息。
如果您有深度嵌套的组件,您应该使用全局状态管理或上下文API(useContext和Provider)来使props可用。
但是因为你使用的是Next.js,你也可以使用app目录。你可以使用next.js服务器渲染组件。所以,你的组件是在服务器端渲染的。此外,获取请求会被Next.js自动删除重复数据,这意味着,Next.js会自动处理缓存获取的数据。所以,你可以自由地在每个嵌套组件中获取相同的数据,而不用担心缓存,prop-drilling等。