如何在Sanity中基于对象数组动态创建Desk结构?
在Sanity中基于对象数组动态创建Desk结构的解决方法
错误原因
你当前的代码直接返回了days.map()生成的列表项数组,但Sanity的Structure Builder要求根结构必须是单个结构对象(如S.list()实例),而非数组,这就是报错的核心原因。
解决方案
调整结构构建逻辑,用S.list()创建根列表容器,再通过.items()方法传入动态生成的列表项数组。同时修正泛型类型匹配返回值类型。
修改后的Desk文件代码
import {ListBuilder} from 'sanity/structure' import defineStructure from '../utils/defineStructure' const days = [ { id: '0', title: 'Monday', schemaType: 'mon', icon: '', }, { id: '4', title: 'Thursday', schemaType: 'thurs', icon: '', }, { id: '5', title: 'Friday', schemaType: 'fri', icon: '', }, ] export default defineStructure<ListBuilder>((S, context) => { return S.list() .title('工作日') // 可自定义根列表标题 .items(days.map(d => S.listItem() .id(d.id) .title(d.title) .icon(d.icon ? () => d.icon : undefined) // 兼容空icon场景 .schemaType(d.schemaType) )) })
关键调整点
- 根结构容器:用
S.list()创建根列表,替代直接返回数组 - 子项传入:通过
.items()方法将动态生成的listItem数组传入根列表 - 泛型修正:将泛型从
ListItemBuilder改为ListBuilder,匹配返回的根列表类型 - icon兼容:处理空icon值,避免无效组件渲染
其他文件(defineStructure.ts和sanity.config.ts)无需修改,保持原代码即可。
内容的提问来源于stack exchange,提问作者GʀᴜᴍᴘʏCᴀᴛ
相关产品推荐
相关产品推荐

