问题标签 [sanity]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
28156 浏览

reactjs - Next.js:减少数据获取并在页面之间共享数据

我正在寻找在 Next.js 应用程序中更好地获取数据的解决方案。在这个问题中,我不只是在寻找解决方案,而是在寻找多种选择,以便我们了解利弊。

我遇到的问题

现在我有几个页面都包含一个显示 som 静态内容的组件和一个具有从 API 获取的一些动态内容的组件。每个页面都做一个fetch()自己getInitialProps()的页面数据,还有页脚数据,这对所有页面都是一样的

这当然有效,但是有很多重复的数据获取。页脚数据将始终为所有页面显示并且始终相同。它也很少在 API 中更改,因此无需重新验证数据。

我正在寻找的答案

我不只是想解决这个问题,我也在寻找一个概述,以便为未来的项目学习一些新的实践。我喜欢编写“显而易见”的代码,所以不要寻找过于 hacky 的解决方案,例如写入window对象等。首选具有较少依赖性的简单解决方案。目标是一个快速的网站。减少网络使用/API 调用并不那么重要。

到目前为止我的想法

这是我想出的可能的解决方案,从简单/明显到更复杂。

  1. 在 Footer 组件(客户端)内部进行 fetch
  2. 在所有 /pages 上获取 getInitialProps(服务器端和客户端)
  3. 使用 HOC 在 _app.js 中进行 fetch 并连接到它getInitialProps()并将其添加到 props 中,因此所有页面都可以使用数据
  4. 使用 zeit/swr 和数据预取来缓存数据
  5. 使用 redux 存储全局状态

所有这些“工作”,但其中大多数将不必要地重新获取数据,和/或增加一点复杂性。这是我所看到的优点/缺点(数字与上面相同):

  1. 简单的!获取代码只在一个地方,它位于使用它的地方。页面加载后获取数据,因此内容“跳转”到查看。一直在重新获取数据。
  2. 简单的!数据是在服务器上获取的,因此在呈现页面之前内容是可用的。为每一页重新获取数据。我们必须记住为它们的每个页面获取相同的页脚数据getInitialProps()
  3. 我们可以在一个地方进行提取并将其添加到所有页面道具中,因此页脚数据自动适用于所有页面的道具。对于某些人来说,要轻松理解正在发生的事情可能有点复杂,因为它需要更多地了解 Next.js/React 的工作原理。仍然重新获取所有页面的数据。我们现在fetch()彼此接连进行两次调用(首先在 _app.js 中加载页脚内容,然后在每个页面中获取自定义内容),因此速度更慢。
  4. 有点简单。我们甚至可以在加载 JS 之前使用预取来加载数据到缓存。第一个页面加载后,我们将快速获取数据。可以直接在页脚组件中获取代码。预rel="preload"取技术不适用于所有类型的提取(例如 Sanity 的客户端使用 groq)。为了没有在初始页面加载后加载数据的“跳跃”内容,我们应该提供useSWR()仍然initialData需要我们在其中获取数据的getInitialProps()内容,但仅在服务器端执行此操作就足够了。可以使用新的getServerSideProps().
  5. 我们可以加载一次数据(?)并在整个应用程序中使用它。快速且更少/无重新获取。添加外部依赖。更复杂的是你必须学习 redux,甚至只加载一个共享数据对象。

当前解决方案,使用要点 2 中描述的解决方案。


希望对此有更多的了解。我缺少明显的东西?

0 投票
1 回答
227 浏览

next.js - 理智和 NextJS,帖子未显示在 index.js 上

我按照教程进行操作,到了最后一部分,您将博客文章放在页面上,页面结束时只有一个 H1 标记,没有任何文章,有人能看一下代码并告诉我原因吗它可能不起作用?

0 投票
1 回答
555 浏览

reactjs - React 异步数据获取不会在静态构建上获取数据

  • 我正在使用Sanity.ioGatsby.js构建一个静态站点。
  • 数据通过 Sanity 托管,我通过GROQ获取它。
  • 主机和构建在Netlify上。

问题是,当我构建时,我只得到Loading. 它确实在开发中起作用。(我敢肯定是因为热加载)

我将如何为构建构建渲染(异步)数据获取?我不想在componentDidMount()oruseEffect()因为据我了解,查询将是客户端。这将导致每个页面加载的 API 请求,对吗?我只想要一个在构建中。

只要还没有数据,我可以暂停构建/渲染吗?

下面是我的简化代码

0 投票
0 回答
308 浏览

reactjs - Sanity PatchEvent 函数对它们的作用不是很清楚

我正在使用理智并试图弄清楚set, unset,insert函数的作用。类本身也有方法PatchEvent,我似乎也找不到任何文档。

例如,我可以看到set在示例中采用了一个参数。但是通过对代码的更多研究,set实际上需要两个参数,一个是 the path,另一个是value. 目前还不清楚 path 是如何工作的以及它究竟做了什么。

由于我正在尝试更新数组中的对象,因此看起来这是我应该做的事情,因为这是在 default 中所做的ArrayInput。我试图让它工作,但没有错误,也没有发生更新。这就是我所拥有的:

PatchEvent.from(key ? set(key, [idx, '_key']) : unset())

最重要的是,我可以看到直接在PatchEvent,和. 我或多或少都想要一些关于所有这些的好的文档,否则我还不如坚持使用 HTTP Api 并自行更新/管理自定义组件的所有内容。prefixAllprependappend

0 投票
1 回答
193 浏览

reactjs - Lunr - gatsby-plugin-lunr - 我可以在构建时更改数据/索引吗?

我有一个需要搜索组件的 Gatsy-Sanity 项目。为此,我想使用gatsby-plugin-lunr。我遇到了一个问题,我的节点是多语言的。例如,我的一个字段的构造如下:

(简而言之,此解析器如下所示。如果键_type以 'locale*' 开头,则仅返回键 en 或 nl 的值。这是由 var 传递的)

我可以制作一个拆分/剥离数据的解析器。我在从搜索索引运行搜索查询的组件内部进行了这种工作(尚未成功)。但这意味着它会在每次搜索时解析它。有没有办法在gatsby-node.js使用 lunr 插件构建时做到这一点?我也需要这个,因为我需要在结果的 slug/path 上添加一个语言前缀。

0 投票
3 回答
1089 浏览

sanity - Sanity.io 便携式文本富文本编辑器中的文本/图像对齐

在 sanity.io 的富文本编辑器(便携式文本)中,是否可以选择将文本(以及图像)与中心对齐?在文档中找不到任何内容

0 投票
1 回答
370 浏览

sanity - 始终解析 groq 查询中的某些字段引用

我们有某些类型的字段指向我们想要解析的引用。有没有办法搜索这些字段,无论它们在树的深处,并在其上应用“->”?我们为这些字段添加了前缀“msg_”。

一个示例结构可能看起来像这样,但也可以更深地隐藏在另一个“子”数组中:

所以我们想要所有以 "msg_" 的硬引用开头的字段。

谢谢!

0 投票
2 回答
63 浏览

reactjs - 使用(嵌套)道具值来引用另一个道具

我正在尝试使用嵌套的道具值,然后使用该值动态获取另一个道具。这适用于浅层(第一级)道具,但当道具嵌套时它会失败。

作品(返回“我的帖子标题):

不起作用(返回未定义,期望“类别标题”):

0 投票
2 回答
316 浏览

javascript - 使用 VS Code 调试 Sanity exec

我正在使用 Sanity (sanity.io headless CMS) 并使用 CLI 进行一些数据迁移。

我如何(或者,是否有可能)如何附加 vscode 调试器并在迁移脚本中的断点处停止。我正在运行以下 cli 迁移脚本:sanity exec migrate.js --with-user-token. 我想在 migrate.js 中的断点处停止?

我已经管理了使用 node 运行的调试控制台应用程序,但不知道在使用sanity exec ... 单步执行代码是查找错误和学习的好方法。

0 投票
1 回答
530 浏览

backup - Sanity.io 备份和恢复(或自动保存文档 ID)

问题 #1:是否可以从 Sanity.io 的备份中恢复已删除的项目?

据我了解,恢复备份是通过从数据集的历史中导出所有文档并导入来完成的。

  1. 恢复- 有一种方法可以做到:https ://www.sanity.io/docs/importing-data 。
  2. 导出- 有两种导出数据的方法:
    1. 导出所有当前存在的数据:https ://www.sanity.io/docs/export 。
    2. 按 ID导出一份历史文档:https ://www.sanity.io/docs/history-api 。

已删除项目的 ID 不会出现在当前存在的数据中(因为它们已被删除,呃),没有它们,我无法获取历史文档。

此外,还有一个问题部分说:

明白了

当前访问控制意味着如果您今天能够访问该文档,您将能够访问该文档的所有先前版本。

问题 #2:如果由于缺少文档 ID 而无法从备份中恢复已删除的项目 - 有没有办法自动保存所有文档 ID(每小时或每当发生更改时)?

我想如果有一种机制也可以保存最后一次看到ID的时间,你也可以或多或少地知道它的删除时间......