reactjs - 通过单击与在 reactjs 中使用挂钩相关的按钮来过滤图像
问题描述
我有来自文件数据 json 的图像,它们在项目渲染时出现在页面中,但是当我单击它上面的按钮以过滤没有图像出现时
我创建 if 条件,当我单击第一个按钮时,它会通过 pramater 调用“all”,因此它应该显示所有图像,但是当我单击其他按钮时,它应该显示它们的类别包括按钮通过的 pramater 的图像,但是当我调试它时数组为空
"portfolio" : [
{
"id":1,
"image": "./images/Portfolio/portfolio-img1.jpg",
"category":["html","wordpress","mobile"]
},
{
"id":2,
"image": "./images/Portfolio/portfolio-img2.jpg",
"category":["html","photoshop"]
},
{
"id":3,
"image": "./images/Portfolio/portfolio-img3.jpg",
"category":["html","wordpress"]
},
{
"id":4,
"image": "./images/Portfolio/portfolio-img4.jpg",
"category":["html","mobile"]
}
] ,
```
function Portfolio() {
const [Images, setImages] = useState([])
useEffect(()=>{
axios.get('data/data.json').then(res =>{
setImages(res.data.portfolio)
})
},[])
const handleClick = (categoryName)=>{
let test = Images;
console.log( categoryName);
if(categoryName === 'all'){
setImages(test)
console.log(test)
}else{
test = Images.filter((img,i)=>{
img.category.includes(categoryName)
})
setImages(test)
console.log(test)
}
}
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>
)
}
解决方案
当您使用过滤后的图像Images
调用时,您会丢失原始图像。setImages
您需要保存categoryName
到状态并按其值进行过滤。
const [filter, setFilter] = useState('all');
...
const handleClick = (categoryName)=>{
setFilter(categoryName);
}
const portfolioImages = (filter === 'all' ? Images : Images.filter(img => img.category.includes(filter))).map((item, i)=>{
return(
<BoxDev key={i}>
<Img src={item.image} alt=""/>
<Overlay>
<BoxSpan>
Show Image
</BoxSpan>
</Overlay>
</BoxDev>
)
})
推荐阅读
- java - java.lang.VerifyError:验证程序被拒绝。拒绝调用,预期 36 个参数寄存器,方法签名有 37 个或更多
- grammar - 语法和语义错误之间的歧义
- leaflet - 使用 laravel mix 出现两次传单标记
- visual-studio-code - 将 git bash 添加到 VSCode 中的默认 shell 列表
- mongodb - 无法在 docker 容器中为 mongodb 日志设置卷
- php - symfony:分页+排序功能
- generics - 如何创建具有所有实现特定特征的字段的结构向量?
- javascript - Reactjs - 使用 xlsx.utils.json_to_sheet 导出到 Excel
- javascript - 使用来自 Thunk Action-Creator 的 History.Push 但没有方法
- node.js - 向结果中添加值以形成猫鼬查询的最佳方法是什么?