【发布时间】:2020-04-26 21:42:19
【问题描述】:
我正在尝试在我的 React 应用中实现多图像文件选择器。
这是我的输入元素:
<input
type="file"
multiple
onChange={handleImageChange}
/>
{renderPhotos(venueImages)}
这些是选择文件时调用的函数:
const [venueImages, setVenueImages] = useState([]);`
const renderPhotos = source => {
console.log(source); ////////log 1
return source.map(photo => {
return <img src={photo} key={photo} />;
});
};
const handleImageChange = e => {
if (e.target.files) {
const filesArray = Array.from(e.target.files);
console.log(filesArray); ///////// log 2
filesArray.forEach(file => {
const tempUrl = URL.createObjectURL(file);
console.log(tempUrl); ////// log 3
setVenueImages([...venueImages, tempUrl]);
});
}
};
我打电话给renderPhotos,在上传之前显示所有选定照片的预览。
我面临的问题如下:
例如,如果我选择 5 张照片,最终只会在屏幕上呈现 1 张。
我在handleImageChange 中插入了控制台日志,而我所记录的内容让我更加困惑。
第二个日志(我在我的代码中对它们进行了编号)打印了一个包含 5 个文件的数组。
从日志 3 之后,我将获得每个文件新生成的临时 URL 的 5 个日志。
但日志 1 只会打印一次。
现在 - 如果我单击输入元素以选择更多文件,我将得到另一个渲染图像。 所以基本上每次我选择图像时,无论我选择了多少,我只会再渲染一张图像。
【问题讨论】:
-
为什么不只调用一次 setVenueImages 而不是为每个图像调用一次呢?你看到哪张图片,第一个加载的?最后一个?
-
@grokked 我看到了最后一个。如果想使用一次,我该怎么做?我不需要创建一个新数组,然后将每个新生成的 url 推送到它,然后调用我的 setVenueImages 命令吗?那不是不必要的代码吗?我现在就试试。
-
好吧!那行得通:)您可以将其添加为答案,我会批准它。但是我还是不明白,为什么先推入一个数组,然后用那个数组设置我的场地,这和轮流推每个项目有什么不同?
标签: javascript reactjs file react-hooks