我有一个React组件,它包装了一个<input type='text' />
,但只有在值更改为有效时调用onChange
。 (自己的状态允许改变输入的文本价值,但是当它调用onChange
,它实际上返回输入的解析值的对象。)让React组件以DOM组件的方式触发更改事件
export default class MyInputClass extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.state = { textValue: '' };
// ...
}
// ...
handleChange(e) {
// set the state regardless of value so the input's text changes
this.setState({ textValue: e.target.value});
// determine whether the value is valid, and if so, call onChange()
let myObj = MyParsedObject.parse(e.target.value);
if (myObj !== null && this.props.onChange) {
this.props.onChange(myObj);
}
}
render() {
return <input onChange={this.handleChange} value={this.state.textValue} />;
}
}
// ...
MyInputClass.propTypes = {
onChange: React.PropTypes.func
};
现在我有一个属性onChange
,这是一个React.PropTypes.func
,并且当输入的更改被触发时,我试图解析输入的值。如果成功,我检查是否this.props.onChange
不是null
,然后致电onChange(myParsedObject)
。
这个工程,但它不感觉没错。 onChange
的处理程序应该期望Event参数(或React中的SyntheticEvent),而不是对象。此外,这种模式只允许一个处理程序onChange
,而真正的事件可以有多个处理程序。
你好吗假设设计React组件发射真实事件?
它是特定的。其他原生JavaScript事件是否会传递多个参数? – dfoverdx
@dfoverdx不,但是复合组件常规包装常规HTML元素并提供其他API。只要它是明确的,我不会看到问题。另一种方法是提供您自己的SyntheticEvent /事件值,但我不确定这是多么困难。 –