javascript - ReactJS FilePond - 上传到一个 FilePond 组件会清除同一页面中其他 FilePond 组件中的状态
问题描述
这个问题是关于 ReactJS 中的 Filepond 的。此处的文件池文档: https ://pqina.nl/filepond/docs/patterns/frameworks/react/
[编辑] 一个独立的代码沙箱,仅用相关代码重现问题:https ://codesandbox.io/s/react-filepond-forked-cvck1?file=/src/App.js
我制作了这个组件,它是 FilePond 的包装器:
export const FormFilePond = ({ id, state, updateFormState, ...props }) => (
<Box borderWidth={5} borderRadius={10} borderStyle='dashed'>
<FilePond
style={{'margin-bottom':0}}
name={id}
files={state}
onupdatefiles={
fileItems => {
console.log("Updating filepond: ", id)
updateFormState(id, fileItems.map(fileItem => fileItem.file))
}
}
{...props}
/>
</Box>
)
(console.log()
电话将说明下面的问题。)
我FormFilePond
在同一页面上有多个实例,具有唯一的id
. value
和在updateFormState
其他地方使用React.useState
父组件定义,因此这是一个受控组件。基本上在跟踪整个表单状态的对象中updateFormState
搜索键( ),并仅更新该键的值。id
也就是说,我认为这可能是 FilePond 特有的问题,因为我还有其他几个表单输入组件,它们都使用相同的功能正确控制状态。只有 FilePond 组件有这个问题。
<FormFieldComponent
id={id}
state={value}
updateFormState={updateFormState}
{...props}
/>
假设我有两个 FilePond 实例,其中id
s of"foo"
和"bar"
. 首先,当我将文件上传到"foo"
FilePond 时,控制台会记录:
Updating filepond: foo
Updating filepond: foo
而且我在 FilePond 组件中正确地看到了上传的文件,尽管我不明白为什么它会更新两次。[编辑添加:当我控制台更新时,没有其他表单组件(输入、文本区域、复选框等)更新两次。它们只记录一次。] 然后,我尝试将图像上传到"bar"
FilePond。我明白了:
Updating filepond: bar
Updating filepond: bar
Updating filepond: foo
Updating filepond: bar
以上实际上是快速连续发生的以下情况:
- 当前两行记录到控制台时,我看到文件成功上传到栏组件一瞬间,但随后:
- 后两行记录到控制台,并且 foo 和 bar 组件的状态都被清除。两个 FilePond 都丢失了文件并再次为空。
为什么会发生这种情况,我该如何解决?我想要的行为是:拥有多个单独的 FilePonds 来跟踪状态不同部分的不同文件。最终用户应该能够将文件上传到所有人。
解决方案
我在 Github 上发布了同样的问题并得到了回答:https ://github.com/pqina/react-filepond/issues/153
这不是 Filepond 的故障,而是我在 React 状态下犯的逻辑错误。请在此处查看解释+资源:https ://github.com/pqina/react-filepond/issues/153#issuecomment-705948028
(非常感谢 Github 用户 sweetliquid 的帮助。)
推荐阅读
- google-cloud-run - 公共 Cloud Run Service 与仅限内部的入口 Cloud Run Service 通信
- linux-kernel - 如何在 /sys 中创建一个类似于无限文件 (FIFO) 的流
- sql - Sum 和 Running Sum、Distinct 和 Running Distinct
- flutter - 如何解决 Flutter 中仅出现在 Android 上的图像质量差异?
- linux - 如何提取proc文件的linux版本和gcc版本?
- javascript - 仅突出显示选中复选框的表格的第一行
- excel - 我如何将 c# 函数转换为 excel
- javascript - 量角器 JavaScript 在具有子类别的下拉框中选择值
- swift - 如何显示 AVPlayerLayer 的底部区域?
- python - Gekko:使用先前定义的变量