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

使用React Hooks实现图片筛选功能时点击按钮无图片显示问题排查

问题原因

  • filter回调语法错误:你在filter的箭头函数中使用了大括号包裹逻辑,但没有显式写return语句,导致所有项的判断结果都返回undefined,filter会过滤掉所有返回假值的项,最终得到空数组。
  • 状态设计不合理:你直接把全量图片数据存在Images状态,每次筛选后直接覆盖这个状态,后续筛选只能在已筛选的小数组中查找,既无法恢复全量数据,也会导致多次筛选结果不符合预期。

修复方案

  1. 新增一个状态存储原始全量图片数据,所有筛选操作都基于全量数据执行
  2. 修正filter回调的返回逻辑
  3. 避免直接修改原状态的引用

修复后代码

JSON结构保持不变,组件代码修改如下:

function Portfolio() {
    // 新增originImages存储全量原始数据,Images存储当前要展示的筛选结果
    const [originImages, setOriginImages] = useState([])
    const [Images, setImages] = useState([])

    useEffect(()=>{
        axios.get('data/data.json').then(res =>{
            setOriginImages(res.data.portfolio)
            // 初始化默认展示所有图片
            setImages(res.data.portfolio)
        })
    },[])

    const handleClick  = (categoryName)=>{
        if(categoryName === 'all'){
            setImages(originImages)
        }else{
            // 修正filter回调,省略大括号隐式返回判断结果
            const filteredImages = originImages.filter(img => img.category.includes(categoryName))
            setImages(filteredImages)
        }
    }

    const portfolioImages = Images.map((item, i)=>{
        return(
            <BoxDev key={i}>
                <Img src={item.image} alt=""/>
                <Overlay>
                    <BoxSpan>
                        Show Image
                    </BoxSpan>
                </Overlay>
            </BoxDev>
        )
    })

    return (
        <Section>
            <Title><TitleSpan>My</TitleSpan> Portfolio</Title>
            <List>
                <ListItem active onClick={() => handleClick('all')}>All</ListItem>
                <ListItem  onClick={() => handleClick("html" )}>HTML</ListItem>
                <ListItem  onClick={() => handleClick("photoshop")}>Photoshop</ListItem>
                <ListItem  onClick={() => handleClick("wordpress")}>Wordpress</ListItem>
                <ListItem  onClick={() => handleClick("mobile")}>Mobile</ListItem>
            </List>
            
            <div className="box">
                {portfolioImages}
            </div>
        </Section>
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:45:02