React用户,这里有一个完整的答案。
React 16.4.2版
您要么希望为每次击键更新,要么只在提交时获取值。将关键事件添加到组件中是有效的,但是在官方文档中有推荐的替代方法。
受控组件与不受控组件
控制
从文档-表单和受控组件:
In HTML, form elements such as input, textarea, and select typically
maintain their own state and update it based on user input. In React,
mutable state is typically kept in the state property of components,
and only updated with setState().
We can combine the two by making the React state be the “single source
of truth”. Then the React component that renders a form also controls
what happens in that form on subsequent user input. An input form
element whose value is controlled by React in this way is called a
“controlled component”.
如果使用受控组件,则必须在值的每次更改时更新状态。为此,需要将事件处理程序绑定到组件。在文档的示例中,通常是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 -受控组件
在大多数情况下,我们建议使用受控组件来实现
形式。在受控组件中,表单数据由React处理
组件。另一种方法是不受控制的组件,其中表单数据
是由DOM本身处理的。
要编写未受控组件,而不是编写事件
对于每个状态更新,都可以使用ref来获取表单值
来自DOM。
这里的主要区别是不使用onChange函数,而是使用表单的onSubmit来获取值,并在必要时进行验证。
例子:
1)在构造函数中绑定事件处理程序并为输入创建ref(不保留状态值)
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中获取值,此时可以进行必要的验证。也不需要为任何输入组件创建任何处理程序函数。
你的问题
现在,关于你的问题:
... 我想让它在我按回车键时被调用,当整个数字已经输入
如果您希望实现这一点,请使用不受控制的组件。如果没有必要,不要创建onChange处理程序。输入键将提交表单,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')
);