【问题标题】:Warning: A component is changing a controlled input of type file警告:组件正在更改文件类型的受控输入
【发布时间】:2020-11-05 06:15:28
【问题描述】:

在使用 react 的应用程序中,我有一个 form 和 radio 输入,它可以选择要呈现的组件,但是当我更改单选选项时,会显示此警告 -

“组件正在更改要控制的类型文件的不受控输入。输入元素不应从不受控切换到受控(反之亦然)。决定在组件的生命周期内使用受控输入元素还是不受控输入元素”

表格

    import React, { useState } from "react";
    export default () => {
        const [link, setLink] = useState("");
        const [arquivo, setArquivo] = useState("");
        const [forma_envio, setFormaEnvio] = useState("");
       
       
        return(
        <React.Fragment>
            <div className="form-check ">
                <input
                    type="radio"
                    className="form-check-input"
                    name="forma"
                    id="forma1"
                    value="File"
                    checked={forma_envio === "File"}
                    onChange={(e) => {
                        setFormaEnvio(e.target.value);
                    }}
                />
            </div>
             <div className="form-check ">
                <input
                    type="radio"
                    className="form-check-input"
                    name="forma"
                    id="forma2"
                    value="Link"
                    checked={forma_envio === "Link"}
                    onChange={(e) => {
                        setFormaEnvio(e.target.value);
                    }}
                />
            </div>
            {forma_envio === "File" ? (
                <input
                    type="file"
                    className="form-control-file form-control"
                     id="arquivo"`
                    onChange={(e) => {
                        e.preventDefault();
                        handleUpload(e.target.files[0]);
                    }}
                />
            ) :forma_envio === "Link" (
                <input
                    value={link}
                    type="text"
                    className="form-control"
                    id="link"
                    onChange={(e) => {
                        e.preventDefault();
                        setLink(e.target.value);
                    }}
                />
            ):
            ("")}
        </React.Fragment>
    );
}

所有状态都以""开头。

一切正常,但我仍然不知道如何解决此警告。

【问题讨论】:

    标签: reactjs react-component


    【解决方案1】:

    确保link的初始值不是null或undefined,而是一个空字符串,比如:

    // const [link, setLink] = React.useState() // ? will cause the warning
    const [link, setLink] = React.useState('') // correct
    

    编辑: 问题被编辑后,我注意到了问题:

    输入“文件”类型的标签MUST BE UNCONTROLLED。您不应将value 或onChange 传递给它。相反,您应该传递一个引用并将其附加到输入。

    const arquivo = useRef(null);
    
    return (
        <React.Fragment>
            // ...
            <input
                type="file"
                ref={arquivo}
                id="arquivo"
            />
        </React.Fragment>
    )
    

    这也是一种罕见的情况,您希望隐藏 DOM 节点而不是避免渲染。 File 对象是直接存储在 DOM 上的,所以必须保留这个 DOM 节点,否则会丢失选中的文件。

    <input
        type="file"
        ref={arquivo}
        id="arquivo"
        style={{ display: forma_envio !== "File" && "none" }}
    />
    

    CodeSandbox 上的完整代码,没有警告。

    【讨论】:

    • 你能用完整的组件代码编辑问题吗?
    • 已编辑,只是没有将发出请求的函数放入数据库,因为它很大。但该功能只是检查请求状态是否为 201 并重定向到另一个路由
    • 问题是 type="file" 的输入没有值。我将根据您的工作示例编辑答案。
    • 这花了一些时间,但我编辑了。文件输入必须不受控制。
    猜你喜欢
    • 2019-04-17
    • 2020-08-06
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多