React 元素的事件处理
React 事件绑定属性的命名采用驼峰式写法,而不是小写(DOM 元素的写法)。
如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM 元素的写法)
html
// 传统HTML
<button onclick="activateLasers()">Activate Lasers</button>
// React
<button onClick="{activateLasers}">Activate Lasers</button>
阻止默认的行为不能使用返回 false 的方式必须使用 e.preventDefault()
类的方法默认不会绑定 this,有四种方法可以解决
- 在 constructor 中绑定
- 在 render 函数中绑定
- 使用箭头函数
- 使用属性初始化器
javascript
class App extends React.Component<any, any> {
constructor(props) {
super(props);
this.state = {
num: 1,
title: ' react study',
};
this.handleClick2 = this.handleClick1.bind(this);
}
handleClick1() {
this.setState({
num: this.state.num + 1,
});
}
handleClick3 = () => {
this.setState({
num: this.state.num + 1,
});
};
render() {
return (
<div>
<h2>Ann, {this.state.num}</h2>
<button onClick={this.handleClick2}>btn1</button>
<button onClick={this.handleClick1.bind(this)}>btn2</button>
<button onClick={() => this.handleClick1()}>btn3</button>
<button onClick={this.handleClick3}>btn4</button>
</div>
);
}
}
在 JS 中,class 的方法默认不会绑定 this,所以 this 使用默认绑定,在严格模式下是 undefined。所以在传递函数的时候必须绑定 this。
合成事件
react SyntheticEvent 是浏览器原生事件跨浏览器的包装器。当需要使用浏览器的底层事件时只需要使用 nativeEvent 来获取即可。
以下事件处理函数在冒泡阶段被触发,如需注册捕获阶段的事件处理函数,只需添加 Capture 即可。例如:onClickCapture。
- 键盘事件
- onKeyDown
- onKeyPress
- onKeyUp
- 焦点事件
- onFocus
- onBlur
- 表单事件
- onChange
- onSubmit
- 鼠标事件
- onClick
- ...