简历:我有一个由家长组成部分多次使用SignForm
组件,我无法想出一个办法,从SignForm
通过input values
到母部件。阵营:从儿童组件获取表单值上提交
我已经搜索了一下,发现一些类似的问题,但在我的情况下,它不工作:/
登录:调用SignForm
class Login extends React.Component {
constructor() {
//... code
}
render() {
return (
<SignForm
cta='Go'
switchSign='Create account'
handleSubmit={this._handleSubmit}
/>
)
}
_handleSubmit(username, password) {
console.log(username, password);
this._validateUser(username, password);
}
_validateUser(username, password) {
//....
}
}
父组件SignForm:包含表单标记的子组件
class SignForm extends React.Component {
constructor() {
super();
var self = this;
}
render() {
return (
<form className="Form" onSubmit={this._onSubmit.bind(this)}>
<div className="Form-body">
<p className="InputSide">
<input id="username" type="text" name="username" ref={(input) => this._username = input}/>
<label htmlFor="username">Username</label>
</p>
<p className="InputSide">
<input id="password" type="pass" name="password" ref={(input) => this._password = input}/>
<label htmlFor="password">Password</label>
</p>
</div>
<div className="Form-footer">
<button type="submit" name="sign" className="BtnBasic--lg">{this.props.cta}</button>
<Link to="/login" className="Link">{this.props.switchSign}</Link>
</div>
</form>
)
}
_onSubmit(e) {
e.preventDefault();
console.log(this._username.value, this._password.value); //it logs the input values.
self.props.handleSubmit(this._username.value, this._password.value); //error
}
}
该视图呈现没有问题显示传递给SignForm的道具。问题是在表单上提交:最后一行self.props.handleSubmit(this._username.value, this._password.value);
返回一个错误:
"Uncaught TypeError: Cannot read property 'handleSubmit' of undefined(…)"
谢谢。
更新:我找到了解决办法,请查看我answer below
避免['.bind'](https://developer.mozilla.org/ en/docs/Web/JavaScript/Reference/Global_objects/Function/bind)。我们不希望'.bind'在每次重新渲染时创建一个新函数。或者在'constructor'中绑定事件处理函数,或者使用[Arrow Function](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions)来定义它们。 –
谢谢!和jpdelatorre的答案一样吗? –
是的,@jpdelatorre答案是一种习惯和公平的解决方案。 –