You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js渲染Sanity博客author字段报React子元素无效错误

问题根因

这个报错来自两个叠加的问题:

  • 你配置的author字段是套了一层object的嵌套结构,实际引用对象的访问路径是blog.author.author,直接渲染blog.author相当于把普通JS对象扔给React渲染,React不支持直接渲染对象,直接抛错。
  • Sanity的reference类型默认只会返回关联文档的_ref ID,不会自动返回关联的作者名称等内容,必须在GROQ查询时主动联表拉取关联字段。
解决方案(三选一即可)

方案1:简化Schema结构(优先选,后续维护成本最低)

当前嵌套一层无意义object的写法完全多余,直接把blog schema里的author字段改成直接引用类型即可:

{
  title: 'Author',
  name: 'author',
  type: 'reference',
  to: [{type: 'author'}]
}

修改完成后需要去Sanity管理后台,给已发布的历史博客重新绑定作者,字段结构调整后旧的嵌套数据会失效。

方案2:保留现有Schema,同步调整查询和渲染逻辑

如果不想改动已有的Schema结构,只需要调整GROQ查询语句和前端渲染代码:

  1. GROQ查询时用->操作符联表展开两层嵌套的作者字段,拉取需要展示的作者信息(字段名根据你自己的author schema调整,比如存名字的字段是name就写name):
*[_type == "blog" && slug.current == $slug][0]{
  // 其余需要的博客字段,比如title、mainImage、body、publishedAt正常写
  "authorInfo": author.author->{
    name,
    avatar,
    bio
  }
}
  1. 前端渲染时直接取拉取回来的具体字段,不要直接渲染对象:
<p className="blog-author">作者:{blog.authorInfo?.name}</p>

方案3:仅调整渲染路径(不推荐)

如果已经在查询里展开了引用字段,只是路径写错了,直接修正渲染时的取值路径即可,注意要取两层author:

<p>作者:{blog.author?.author?.name}</p>

这个写法因为嵌套结构冗余,后续维护很容易写错路径,不建议长期用。

注意事项
  • 所有Sanity的reference关联字段,要拿到关联文档的具体内容,必须在GROQ查询里加->展开,不然拿到的只有带_ref的引用标识,取不到名称、头像这类实际内容。
  • React JSX里只支持渲染字符串、数字、合法JSX节点、数组这类类型,只要出现「Objects are not valid as a React child」报错,先检查是不是直接把普通对象放到了花括号里渲染。

内容的提问来源于stack exchange,提问作者keyur kasvala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:45:32