响应用户,这里是完整的答案。
反应版本 16.4.2
您要么想为每次击键更新,要么只在提交时获取值。向组件添加关键事件是可行的,但官方文档中推荐了其他替代方法。
受控组件与非受控组件
受控
来自Docs - Forms and Controlled components:
在 HTML 中,表单元素(例如 input、textarea 和 select)通常
维护自己的状态并根据用户输入进行更新。在反应中,
可变状态通常保存在组件的 state 属性中,
并且仅使用 setState() 更新。
我们可以通过使 React 状态成为“单一来源”来将两者结合起来
真理”。然后渲染表单的 React 组件也控制
在随后的用户输入中,该表单会发生什么。输入表单
以这种方式由 React 控制值的元素称为 a
“受控组件”。
如果您使用受控组件,则每次更改值时都必须更新状态。为此,您将事件处理程序绑定到组件。在文档的示例中,通常是 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) 渲染
<form onSubmit={this.handleSubmit}>
<label>
Name:
<input type="text" value={this.state.value} onChange={this.handleChange} />
</label>
<input type="submit" value="Submit" />
</form>
如果您使用受控组件,您的handleChange 函数将始终被触发,以便更新并保持正确的状态。状态将始终具有更新的值,并且当提交表单时,该值将从状态中获取。如果您的表单很长,这可能是一个缺点,因为您必须为每个组件创建一个函数,或者编写一个简单的函数来处理每个组件的值变化。
不受控制
来自Docs - Uncontrolled component
在大多数情况下,我们建议使用受控组件来实现
形式。在受控组件中,表单数据由 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",
// bsStyle: this.validationInputFactor(),
placeholder: this.initialFactor,
className: "input-block-level",
// onChange: this.handleInput,
block: true,
addonBefore: '%',
ref:'input',
hasFeedback: true
});
处理表单提交并验证您的输入。您需要从表单提交函数中的元素中获取值,然后进行验证。确保在构造函数中创建对元素的引用。
handleSubmit(event) {
// Get value of input field
let value = this.input.current.value;
event.preventDefault();
// Validate 'value' and submit using your own api or something
}
非受控组件的使用示例:
class NameForm extends React.Component {
constructor(props) {
super(props);
// bind submit function
this.handleSubmit = this.handleSubmit.bind(this);
// create reference to input field
this.input = React.createRef();
}
handleSubmit(event) {
// Get value of input field
let value = this.input.current.value;
console.log('value in input field: ' + value );
event.preventDefault();
// Validate 'value' and submit using your own api or something
}
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')
);