3 回答
TA贡献1906条经验 获得超10个赞
在这种情况下,事件监听器不是必需的。
首先,调整enterKeyPress为不创建事件侦听器。如果尚未在构造函数中绑定该函数,则可以将enterKeyPress转换为箭头函数:
enterKeyPress = (e) => {
if (e.keyCode === 13) {
console.log('enter key pressed!');
e.preventDefault();
this.loginUser();
});
}
转换enterKeyPress为箭头函数是将函数范围限定到组件的一种方法。另一个选择是将函数绑定到构造函数中或render函数中,这在其他地方已有详细记录。如果已经在构造函数中绑定了该函数(此处未包括该函数),则可以忽略该部分。
其次,调整您的onKeyPress属性以传递函数,而不是调用它:
<Input
type="password"
placeholder="Password"
onChange={e =>
this.setState({ password: e.target.value })
}
onKeyPress={this.enterKeyPress}
/>
还要指出的是,这里还有另一个通用的JavaScript错误:在事件侦听器中使用匿名回调函数。通过使用匿名函数,您可以多次添加同一函数,因为每次都会生成不同的函数引用。这也意味着您以后将无法删除它,因为您将需要函数引用来删除它。
同样,这里不需要事件侦听器,但是如果这样做了,则可能应该在组件范围内定义回调,以便稍后可以将其删除。使用事件侦听器的常见模式如下:
handleKeyPress = (e) => {
if (e.keyCode === 13) {
console.log('enter key pressed!');
e.preventDefault();
this.loginUser();
});
}
componentDidMount() {
window.addEventListener("keypress", this.handleKeyPress);
}
componentWillUnmount() {
window.removeEventListener("keypress", this.handleKeyPress);
}
TA贡献1772条经验 获得超6个赞
在这种情况下,事件监听器不是必需的。
首先,调整enterKeyPress为不创建事件侦听器。如果尚未在构造函数中绑定该函数,则可以将enterKeyPress转换为箭头函数:
enterKeyPress = (e) => {
if (e.keyCode === 13) {
console.log('enter key pressed!');
e.preventDefault();
this.loginUser();
});
}
转换enterKeyPress为箭头函数是将函数范围限定到组件的一种方法。另一个选择是将函数绑定到构造函数中或render函数中,这在其他地方已有详细记录。如果已经在构造函数中绑定了该函数(此处未包括该函数),则可以忽略该部分。
其次,调整您的onKeyPress属性以传递函数,而不是调用它:
<Input
type="password"
placeholder="Password"
onChange={e =>
this.setState({ password: e.target.value })
}
onKeyPress={this.enterKeyPress}
/>
还要指出的是,这里还有另一个通用的JavaScript错误:在事件侦听器中使用匿名回调函数。通过使用匿名函数,您可以多次添加同一函数,因为每次都会生成不同的函数引用。这也意味着您以后将无法删除它,因为您将需要函数引用来删除它。
同样,这里不需要事件侦听器,但是如果这样做了,则可能应该在组件范围内定义回调,以便稍后可以将其删除。使用事件侦听器的常见模式如下:
handleKeyPress = (e) => {
if (e.keyCode === 13) {
console.log('enter key pressed!');
e.preventDefault();
this.loginUser();
});
}
componentDidMount() {
window.addEventListener("keypress", this.handleKeyPress);
}
componentWillUnmount() {
window.removeEventListener("keypress", this.handleKeyPress);
}
TA贡献1799条经验 获得超9个赞
通过快速搜索,我认为这可能会满足您的需求:
enterKeyPress(e) {
if (e.keyCode === 13) {
console.log('enter key pressed!'); // I will receive this msg (N+1) times when there're N characters in the input text area
e.preventDefault();
this.loginUser(); // this is the login function I want to call after press enter key, but just once per press
});
}
render() {
return(
<Input
type="password"
placeholder="Password"
onChange={e =>
this.setState({ password: e.target.value })
}
onKeyPress={this.enterKeyPress}
/>
);
}
onKeyPress 已经完成了您要添加的事件侦听器的操作,因此只需直接将其传递给keypress事件即可。
添加回答
举报