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

如何在Sanity中仅获取指定单选值的文档?

过滤Sanity展览数据的两种实现方式

方法一:在GROQ查询阶段过滤(推荐)

直接在Sanity的数据请求中添加过滤条件,只获取exhibition_status为current的文档,这种方式能减少前端接收的数据量,提升性能。

修改你的useEffect中的查询语句:

useEffect(() => {
    sanityClient.fetch(
        `*[_type=="exhibitions" && exhibition_status == "current"]{
            exhibition_name,
            exhibition_image{
                asset->{
                    _id,
                    url
                }
            },
            exhibition_status
        }`)
        .then((data) => setExhibitionData(data))
        .catch(err => console.error(err));
}, [] );

方法二:在React前端过滤

如果需要保留所有展览数据(比如切换过往/当前/未来标签时无需重新请求),可以在获取全量数据后,在前端做过滤:

方式1:渲染时直接过滤

修改渲染列表的代码,先过滤出状态为current的项再遍历:

{exhibitionData && exhibitionData
    .filter(item => item.exhibition_status === 'current')
    .map((exhibition, index) => (
        <div className="ex-current" key={index}>
            <h3>{exhibition.exhibition_name}</h3>
            <img src={urlFor(exhibition.exhibition_image).url()} alt={exhibition.exhibition_name} />
        </div>   
    ))}

方式2:用useMemo缓存过滤结果(优化性能)

如果数据量较大,用useMemo缓存过滤后的结果,避免每次渲染重复计算:

import { useState, useEffect, useMemo} from 'react'

// ... 其他代码不变

const currentExhibitions = useMemo(() => {
    return exhibitionData?.filter(item => item.exhibition_status === 'current') || [];
}, [exhibitionData]);

// 渲染时直接使用缓存后的结果
return (
    // ... 其他结构不变
    {currentExhibitions.map((exhibition, index) => (
        <div className="ex-current" key={index}>
            <h3>{exhibition.exhibition_name}</h3>
            <img src={urlFor(exhibition.exhibition_image).url()} alt={exhibition.exhibition_name} />
        </div>   
    ))}
)

注意:你的代码中图片alt属性使用了exhibition_alt,但Sanity schema里没有定义这个字段,建议要么在schema中添加exhibition_alt字段,要么替换为已有的exhibition_name

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:10:31