在 React 中更改受控输入值时发出警告

Posted

技术标签:

【中文标题】在 React 中更改受控输入值时发出警告【英文标题】:Warning when changing controlled input value in React 【发布时间】:2018-10-02 19:40:51 【问题描述】:

我正在用 React 写一个小博客,但在更新输入更改事件的状态时遇到问题。

警告是:

警告:组件正在将文本类型的受控输入更改为 不受控制。输入元素不应从受控切换到 不受控制(反之亦然)。决定使用受控或 组件生命周期内不受控制的输入元素

这是我的代码:

构造函数:

constructor(props)
        super(props);

        this.state = 
            id: '',
            post: 
                title: '',
                slug: '',
                content: ''
            
        

        this.handleChange = this.handleChange.bind(this);

    

handleChange 函数

handleChange(event) 
        const target = event.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const name = target.name;

        this.setState(
            post: 
                [name]: value
            
        );
    

输入渲染:

render()
        return (
            <div>
                <AdminMenu />
                <div id="admin-post-form">
                    <div className="input-group vertical">
                        <label>Título</label>
                        <input
                            name="title"
                            placeholder="Título"
                            type="text"
                            value=this.state.post.title
                            onChange=this.handleChange
                        />
                    </div>
                    <div className="input-group vertical">
                        <label>Slug</label>
                        <input
                            name="slug"
                            placeholder="Slug"
                            type="text"
                            value=this.state.post.slug
                            onChange=this.handleChange
                        />
                    </div>

                </div>
            </div>
        )
    

我的代码有什么问题?该字段已更新,但我收到了警告。

谢谢!

【问题讨论】:

reactjs.org/docs/uncontrolled-components.html 【参考方案1】:

您的设置状态正在重置整个post 对象。您可能想要执行以下操作:

this.setState(
    post: 
        ...this.state.post
        [name]: value
    
)

【讨论】:

【参考方案2】:

已解决使用扩展运算符,这是使用嵌套属性的更新后的 handleChange 函数:

handleChange(event) 
        const target = event.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const name = target.name;

        var post = ...this.state.post
        post[name] = value;
        this.setState(post);
    

【讨论】:

【参考方案3】:

这个:

    this.setState(
        post: 
            [name]: value
        
    );

将用只有一个键的对象完全替换this.state.post。例如,如果nameslug,则将post 替换为 slug: 'something'

因此,如果您编辑一个字段,所有其他字段将变为undefined。 React 将 value=undefined 视为 uncontrolled component 并警告您。

要解决此问题,您可能希望将 post 更新与现有对象合并,而不是替换它:

    this.setState(prevState => (
        post: 
            ...prevState.post,
            [name]: value
        
    ));

【讨论】:

prevState 是内置函数还是保留关键字?

以上是关于在 React 中更改受控输入值时发出警告的主要内容,如果未能解决你的问题,请参考以下文章

警告:组件正在将文本类型的受控输入更改为不受控制。 (反应.js)

在 React 中更改受控输入的值

警告:组件正在更改要控制的类型文本的不受控输入

电子邮件输入警告 - 组件正在将文本类型的受控输入更改为不受控制

Next.js/React 在组件中生成随机值时发出警告

Material UI Select Component - 一个组件正在将文本类型的受控输入更改为不受控制