我有一个简单的react组件的形式,我相信有一个受控的输入:
import React from 'react';
export default class MyForm extends React.Component {
constructor(props) {
super(props);
this.state = {}
}
render() {
return (
<form className="add-support-staff-form">
<input name="name" type="text" value={this.state.name} onChange={this.onFieldChange('name').bind(this)}/>
</form>
)
}
onFieldChange(fieldName) {
return function (event) {
this.setState({[fieldName]: event.target.value});
}
}
}
export default MyForm;
当我运行我的应用程序,我得到以下警告:
警告:MyForm正在将文本类型的未受控输入更改为
控制。输入元素不应该从不受控切换到
控制(反之亦然)。决定是使用受控的还是
在组件的生命周期内不受控制的输入元素
我相信我的输入是受控的,因为它有一个值。我在想我做错了什么?
我使用的是React 15.1.0
我知道其他人已经回答了这个问题。但这里有一个非常重要的因素,可能会帮助其他经历类似问题的人:
你必须有一个onChange处理程序添加在您的输入字段(例如textField,复选框,无线电等)。始终通过onChange处理程序处理活动。
例子:
<input ... onChange={ this.myChangeHandler} ... />
当你使用复选框时,你可能需要用!!来处理它的选中状态。
例子:
<input type="checkbox" checked={!!this.state.someValue} onChange={.....} >
参考:https://github.com/facebook/react/issues/6779 # issuecomment - 326314716
当你在你的输入中使用onChange={this. onfieldchange ('name').bind(this)}时,你必须声明你的状态空字符串作为属性字段的值。
不正确的方法:
this.state ={
fields: {},
errors: {},
disabled : false
}
正确的方法:
this.state ={
fields: {
name:'',
email: '',
message: ''
},
errors: {},
disabled : false
}
我相信我的输入是受控的,因为它有一个值。
对于一个被控制的输入,它的值必须与状态变量的值相对应。
在您的示例中,这个条件最初没有满足,因为this.state.name最初没有设置。因此,输入最初是不受控制的。一旦onChange处理程序第一次被触发,this.state.name就会被设置。此时,上述条件满足,则认为输入是受控的。这种从不受控到受控的转变产生了上面所见的错误。
通过在构造函数中初始化this.state.name:
e.g.
this.state = { name: '' };
输入将从一开始就受到控制,从而解决问题。更多示例请参见React受控组件。
与此错误无关,您应该只有一个默认导出。上面的代码有两个。
我知道其他人已经回答了这个问题。但这里有一个非常重要的因素,可能会帮助其他经历类似问题的人:
你必须有一个onChange处理程序添加在您的输入字段(例如textField,复选框,无线电等)。始终通过onChange处理程序处理活动。
例子:
<input ... onChange={ this.myChangeHandler} ... />
当你使用复选框时,你可能需要用!!来处理它的选中状态。
例子:
<input type="checkbox" checked={!!this.state.someValue} onChange={.....} >
参考:https://github.com/facebook/react/issues/6779 # issuecomment - 326314716