我创建了一个带有文件输入和文本字段的字段数组。一切似乎都很好,但是当我尝试上传小图像或在文本字段中输入内容时,会弹出一个类型错误,并显示“onChange 不是函数”消息。如何修复此错误?
我已将代码上传到代码沙箱: https ://codesandbox.io/s/cool-wildflower-6jlcl?file=/src/App.js
我创建了一个带有文件输入和文本字段的字段数组。一切似乎都很好,但是当我尝试上传小图像或在文本字段中输入内容时,会弹出一个类型错误,并显示“onChange 不是函数”消息。如何修复此错误?
我已将代码上传到代码沙箱: https ://codesandbox.io/s/cool-wildflower-6jlcl?file=/src/App.js
您的整个代码按预期工作,您得到的错误onChange
是因为未声明函数。您期望从组件的render 属性中Controller
获得它,但您没有以正确的方式获得它。
71 号线
render={({ onChange }) => /** rest */ }
应该
render={({ field: { onChange } }) => /** rest */ }
好吧,首先您不能将函数命名为onChange
已定义的默认 onChange,其次您从未定义过该函数。
const handleChange = (value) => console.log("onchange ", value);
然后
<Controller
control={control}
name={`files.${index}.description`}
render={({ onChange }) => (
<input
style={{ border: "1px solid blue" }}
placeholder={"describe your file here"}
onChange={(event) =>
handleChange({ text: event.target.value }) // calling the handleChange function
}
/>
我认为它应该工作
您正在调用该onChange
函数,但您从未声明过它。
1.输入栏
从我所见,您只需进行 2 处小更改即可使输入正常工作:
const [input, setInput] = useState("");
onChange
将输入参数更改为:onChange="event => setInput(event.target.value)"
这应该使文本输入工作。
2.文件输入栏
对于文件输入,请确保您阅读此内容
因为它的值是只读的,所以它在 React 中是一个不受控制的组件。[...] 您应该使用 File API 与文件进行交互。
更多文档: https ://reactjs.org/docs/forms.html#control-components
https://rangle.io/blog/simplifying-controlled-inputs-with-hooks/