【发布时间】:2021-09-13 12:28:46
【问题描述】:
我正在尝试构建一个可以上传多个图像的表单。
可以在预览图像期间删除图像。
例如,我上传了两张图片,然后我尝试点击删除按钮来删除两张正常工作的图片之一。
问题是在我点击提交按钮的过程中,假设会将一张图片发布到 API,但仍有两张图片发布到 API。
我正在使用 React 钩子表单,有人知道有什么问题吗?
这是项目链接
https://codesandbox.io/s/boring-hermann-xrqbt
const methods = useFormContext();
const { control, watch, setValue, formState } = methods;
const [image, setImage] = useState([]);
function deleteFile(id) {
const s = image.filter((item, index) => item.id !== id);
setImage(s);
}
<div className="flex justify-center sm:justify-start flex-wrap -mx-16">
<Controller
name="images"
control={control}
render={({ field: { onChange, value } }) => (
<label
htmlFor="button-file"
className={clsx(
classes.productImageUpload,
"flex items-center justify-center relative w-128 h-128 rounded-16 mx-12 mb-24 overflow-hidden cursor-pointer shadow hover:shadow-lg"
)}
>
<input
accept="image/*"
className="hidden"
id="button-file"
type="file"
onChange={async (e) => {
function readFileAsync() {
return new Promise((resolve, reject) => {
const file = e.target.files[0];
if (!file) {
return;
}
const reader = new FileReader();
reader.onload = () => {
resolve({
id: FuseUtils.generateGUID(),
url: `data:${file.type};base64,${btoa(reader.result)}`,
type: "image",
});
};
reader.onerror = reject;
reader.readAsBinaryString(file);
});
}
const newImage = await readFileAsync();
setImage([newImage, ...image]);
onChange([newImage, ...image]);
}}
/>
<Icon fontSize="large" color="action">
cloud_upload
</Icon>
</label>
)}
/>
<Controller
name="featuredImageId"
control={control}
defaultValue=""
render={({ field: { onChange, value } }) =>
image.map((media) => (
<div
onClick={() => onChange(media.id)}
onKeyDown={() => onChange(media.id)}
role="button"
tabIndex={0}
className={clsx(
classes.productImageItem,
"flex items-center justify-center relative w-128 h-128 rounded-16 mx-12 mb-24 overflow-hidden cursor-pointer outline-none shadow hover:shadow-lg",
media.id === value && "featured"
)}
key={media.id}
>
<Icon
className={classes.productImageFeaturedStar}
onClick={() => deleteFile(media.id)}
>
Delete
</Icon>
<img
className="max-w-none w-auto h-full"
src={media.url}
alt="product"
/>
</div>
))
}
/>
</div>;
【问题讨论】:
标签: reactjs react-hooks react-hook-form