React用户,这里有一个完整的答案。
React版本为16.4.2
您可以选择在每次按键时更新,或仅在提交时获取值。将键事件添加到组件中可以工作,但官方文档中也推荐了其他方法。
受控组件 vs 非受控组件
受控组件
来自文档 - 表单和受控组件:
在HTML中,诸如input、textarea和select之类的表单元素通常会维护其自己的状态,并根据用户输入进行更新。在React中,可变状态通常保存在组件的state属性中,并且只能使用setState()进行更新。
我们可以通过使React状态成为“单一数据源”来将两者结合起来。然后呈现表单的React组件还可以控制随后的用户输入中发生的事情。以这种方式由React控制值的输入表单元素称为“受控组件”。
如果使用受控组件,则必须在每次更改值时保持状态更新。为此,将事件处理程序绑定到组件上。在文档的示例中,通常使用onChange事件。
示例:
1)在构造函数中绑定事件处理程序(值保存在状态中)
constructor(props) {
super(props);
this.state = {value: ''};
this.handleChange = this.handleChange.bind(this);
}
2)创建处理程序函数
handleChange(event) {
this.setState({value: event.target.value});
}
3)创建表单提交函数(从状态中获取值)
handleSubmit(event) {
alert('A name was submitted: ' + this.state.value);
event.preventDefault();
}
4) Render
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="Submit" />
</form>
如果您使用
受控组件,则为了更新和保持正确的状态,始终会触发
handleChange
函数。状态将始终具有更新后的值,并且在提交表单时,值将从状态中获取。如果您的表单非常长,则可能会有缺点,因为您将不得不为每个组件创建一个函数,或者编写一个简单的函数来处理每个组件的值更改。
不受控制的组件
来自
文档-不受控制的组件
大多数情况下,我们建议使用受控组件来实现表单。在受控组件中,表单数据由React组件处理。另一种选择是不受控制的组件,在这种情况下,表单数据由DOM本身处理。
要编写不受控制的组件,您可以使用ref从DOM中获取表单值,而不是为每个状态更新编写事件处理程序。
主要区别在于您不使用
onChange
函数,而是使用表单的
onSubmit
来获取值,并在必要时进行验证。
例如:
1)在构造函数中绑定事件处理程序并创建对输入的引用(不保留任何状态值)
constructor(props) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this);
this.input = React.createRef();
}
2) 创建表单提交函数(从DOM组件中获取值)
handleSubmit(event) {
alert('A name was submitted: ' + this.input.current.value);
event.preventDefault();
}
3)渲染
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" ref={this.input} />
</label>
<input type="submit" value="Submit" />
</form>
如果您使用
不受控制的组件,则无需绑定
handleChange
函数。当提交表单时,将从DOM中获取值,并在此时进行必要的验证。也不需要为任何输入组件创建任何处理程序函数。
您的问题
现在,针对您的问题:
...我希望在输入整数后按下“Enter”时调用它
如果您想实现这一点,请使用不受控制的组件。如果不必要,则不要创建onChange处理程序。 enter
键将提交表单,并将触发handleSubmit
函数。
您需要做出的更改:
从您的元素中删除onChange调用
var inputProcent = React.CreateElement(bootstrap.Input, {type: "text",
placeholder: this.initialFactor,
className: "input-block-level",
block: true,
addonBefore: '%',
ref:'input',
hasFeedback: true
});
处理表单提交并验证您的输入。您需要在表单提交函数中获取元素的值,然后进行验证。确保在构造函数中创建对元素的引用。
handleSubmit(event) {
let value = this.input.current.value;
event.preventDefault();
}
未受控组件的示例用法:
class NameForm extends React.Component {
constructor(props) {
super(props);
this.handleSubmit = this.handleSubmit.bind(this);
this.input = React.createRef();
}
handleSubmit(event) {
let value = this.input.current.value;
console.log('value in input field: ' + value );
event.preventDefault();
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" ref={this.input} />
</label>
<input type="submit" value="Submit" />
</form>
);
}
}
ReactDOM.render(
<NameForm />,
document.getElementById('root')
);
onBlur
事件。 - wuct<input ref='reference' onKeyUp={(e) => {(e.keyCode === 13 ? doSomething(this.refs.reference.value) : null)}} />
- musemindref
。<input onKeyPress={e => doSomething(e.target.value)}
就足够了。 - wuctonKeyPress
事件时创建一个新函数。这是一种微小的性能优化。 - wuctonKeyUp
,因为它只会在松开按键时触发。另一方面,如果用户按住键不放,onKeyDown
将会多次触发。 - kawerewagaba