我正在开发一个将图像添加到项目的组件。您可以上传自己的图片或选择一张图片,根据项目名称从 API 加载。
这是根组件:
const AddMedia = (props) => {
const [currentTab, setCurrentTab] = useState(0);
const [itemName, setItemName] = useState(props.itemName);
return (
<div>
<Tabs
value={currentTab}
onChange={() => setCurrentTab(currentTab === 0 ? 1 : 0)}
/>
<div hidden={currentTab !== 0}>
<FileUpload />
</div>
<div hidden={currentTab !== 1}>
{currentTab === 1 && <ImagePicker searchTerm={itemName} />}
</div>
</div>
);
};
这是<ImagePicker />
:
import React, { useState, useEffect } from "react";
function ImagePicker({ searchTerm, ...props }) {
const [photos, setPhotos] = useState([]);
const searchForImages = async (keyword) => {
const images = await api.GetImagesByKeyword(keyword);
return images;
};
useEffect(() => {
const result = searchForImages(searchTerm);
setPhotos(result);
}, []);
return (
<>
{photos.map(({ urls: { small } }, j) => (
<img alt={j} src={small} className={classes.img} />
))}
</>
);
}
const areSearchTermsEqual = (prev, next) => {
return prev.searchTerm === next.searchTerm;
};
const MemorizedImagePicker = React.memo(ImagePicker, areSearchTermsEqual);
export default MemorizedImagePicker;
我正在努力解决的问题是让组件在searchTerm
未更改的情况下不再获取结果。例如,当组件在选项卡 0(上传图像)上加载时,您切换到选项卡 1(选择图像)并获取结果searchTerm
,然后切换到 0 并再次切换到 1 并再次获取它们,尽管searchTerm
没有改变。如您所见,我尝试使用React.memo
但无济于事。另外,我添加了currentTab === 1
以阻止它在根组件呈现时获取照片,并且仅在活动选项卡为 1 时才获取它们。