Sanity Studio:如何基于引用字段值条件隐藏字段?
解决Sanity Studio中基于引用字段内容条件隐藏字段的问题
问题核心是:Sanity字段上下文里的引用字段默认只返回_ref和_type,不会自动拉取关联文档的完整数据,所以没法直接通过parent?.destinationType?.name做判断。要解决这个问题,需要手动调用Sanity客户端获取关联的DestinationType文档内容。
步骤1:导入并初始化Sanity客户端
在你的schema文件顶部导入getClient,并初始化客户端(替换成你的项目ID和数据集名称):
import { getClient } from '@sanity/client' const client = getClient({ projectId: '你的项目ID', dataset: '你的数据集', useCdn: false // 禁用CDN确保获取最新文档 })
步骤2:修改字段的hidden配置为异步函数
针对每个需要条件隐藏的字段,把hidden改成异步函数,手动拉取关联的DestinationType文档,再根据name值判断是否隐藏。
比如cityRef字段的配置修改后:
defineField({ name: "cityRef", title: "Destination City Reference", type: "reference", to: { type: "destination" }, hidden: async ({ parent }) => { // 如果未选择DestinationType,默认不隐藏(可根据需求调整) if (!parent?.destinationType?._ref) return false; // 拉取关联的DestinationType文档 const destType = await client.getDocument(parent.destinationType._ref); // 仅当类型为"City"时显示,其他情况隐藏(包括Region) return destType.name !== "City"; }, options: { filter: ({ document }) => ({ filter: 'destinationType->name == "City"', }), }, }),
步骤3:对其他字段做类似配置
根据需求调整判断逻辑即可:
stateRef的hidden函数:return destType.name !== "State"countryRef的hidden函数:return destType.name !== "Country"- 如果要实现「选中Region时隐藏这三个字段」,可直接判断:
return destType.name === "Region"
注意事项
- 异步函数会带来轻微性能开销,但因为
DestinationType仅4个文档,实际使用几乎无影响 - 确保客户端的项目ID和数据集配置正确,否则会拉取不到数据
内容的提问来源于stack exchange,提问作者KJ Prince
相关产品推荐
相关产品推荐

