React元素的事件处理与DOM元素类似,但语法上有一些区别。
React元素与DOM元素的事件处理的语法区别:
传统的HTML:
<button onclick="activateLasers()"> Activate Lasers </button>
在React中则如下所示:
<button onClick={activateLasers}>
Activate Lasers
</button>
在HTML中通过返回false即可阻止事件生效:
<a href="https://zhuanfou.com" onclick="console.log('该链接被点击了'); return false">
来点我呀
</a>
在React中则如下所示:
function ActionLink() {
function handleClick(e) {
e.preventDefault();
console.log('该链接被点击了');
}
return (
<a href="https://zhuanfou.com" onClick={handleClick}>
来点我呀
</a>
);
}
如下所示的类组件的构造器中要将this绑定到该回调函数中:
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
// 绑定才可以在回调函数handleClick中调用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')
);
如果不想在构造器中bind,可用如下简化写法,直接将事件绑定对象传到函数中去,与上述代码是等效的。
render() {
return (
<button onClick={(e) => this.handleClick(e)}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
在React中,以下两种方式都可以向事件处理的回调函数传递参数:
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>