React 元素的事件处理和 DOM 元素的很相似,但是有一点语法上的不同 React 事件的命名采用小驼峰式(camelCase),而不是纯小写
1、React阻止默认行为的传递
在 React 中不能通过返回 false 的方式阻止默认行为。必须显式的使用 preventDefault 。
传统的 HTML 中阻止链接默认打开一个新页面
A.HTML中的做法
<a href="#" onclick="console.log('The link was clicked.'); return false">Click me</a>
B.React中的做法
e 是React 根据 W3C 规范来定义的一个合成事件。
function ActionLink() {function handleClick(e) {e.preventDefault();console.log('The link was clicked.');}return (<a href="#" onClick={handleClick}>Click me</a>);}
2、React事件绑定至当前this对象
在 JavaScript 中,class 的方法默认不会绑定 this。如果未绑定 this.handleClick 并把它传入了 onClick,当调用这个函数的时候 this 的值为 undefined。
A.在构造函数中进行绑定
this.handleClick = this.handleClick.bind(this);
class Toggle extends React.Component {constructor(props) {super(props);this.state = {isToggleOn: true};// 为了在回调中使用 `this`,这个绑定是必不可少的this.handleClick = this.handleClick.bind(this);}handleClick() {this.setState(state => ({isToggleOn: !state.isToggleOn}));}render() {return (<button onClick={this.handleClick}>{this.state.isToggleOn ? 'ON' : 'OFF'}</button>);}}ReactDOM.render(<Toggle />,document.getElementById('root'));
B. public class fields 语法
handleClick = () => {}
class LoggingButton extends React.Component {// 此语法确保 `handleClick` 内的 `this` 已被绑定。// 注意: 这是 *实验性* 语法。handleClick = () => {console.log('this is:', this);}render() {return (<button onClick={this.handleClick}>Click me</button>);}}
C.在回调中使用箭头函数进行绑定
onClick={(e) => this.handleClick(e)}
class LoggingButton extends React.Component {handleClick() {console.log('this is:', this);}render() {// 此语法确保 `handleClick` 内的 `this` 已被绑定。return (<button onClick={(e) => this.handleClick(e)}>Click me</button>);}}
3、向事件处理函数传递参数
通过箭头函数和 [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind) 来实现。
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button><button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
在这两种情况下,React 的事件对象 e 会被作为第二个参数传递。如果通过箭头函数的方式,事件对象必须显式的进行传递,而通过 bind 的方式,事件对象以及更多的参数将会被隐式的进行传递。
