〉这是我的库组件
import React, {useState} from 'react';
import useFirestore from '../hooks/useFirestore';
import { motion } from 'framer-motion';
const Gallery = ({ setSelectedImg }) => {
const { docs } = useFirestore('images');
这里我将状态设置为Tags数组
const [tags, setTags] = useState([""]);
const addTag = (e) => {
if (e.key === "Enter") {
if (e.target.value.length > 0) {
setTags([...tags, e.target.value]);
e.target.value = "";
}
}
};
用于添加和删除标记的函数
const removeTag = (removedTag) => {
const newTags = tags.filter((tag) => tag !== removedTag);
setTags(newTags);
};
return (
<>
<div className="img-grid">
{docs && docs.map(doc => (
< motion.div className="img-wrap" key={doc.id}
layout
whileHover={{ opacity: 1 }}s
onClick={() => setSelectedImg(doc.url)}
>
这里我添加标签输入到每个图像...问题是,当添加一个标签被添加到所有的图片。我想添加标签的图像,我选择。
<div className="tag-container">
{tags.map((tag, ) => {
return (
<div key={doc.id} className="tag">
{tag} <span onClick={() => removeTag(tag)}>x</span>
</div>
);
})}
<input onKeyDown={addTag} />
</div>
<motion.img src={doc.url} alt="uploaded pic"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ delay: 1 }}
>
</motion.img>
</motion.div>
))}
</div>
</>
)
}
export default Gallery;
1条答案
按热度按时间eeq64g8w1#
你用来存储用户输入的值的
tags
数组对于每个image item
来说不是唯一的。1.创建一个对象,用于存储每个图像的标记数组:
const [tagsObj, setTagsObj] = {}
,然后在为image_1
添加新标签时,您可以简单地执行setTagsObj(prevObj => {...prevObj, image_1: [...prevObj?.image_1, newTagValue]}
,1.或者创建一个
Image
组件,然后处理单个图像的标记:图库组件:
映像项组件:
请参考此沙盒(如果可用),以方便使用Gallery unique image tags sandbox
我建议使用第二种方法,因为它很容易理解和调试。
我希望这有帮助,如果有帮助,请接受答案!