React学习笔记(六)事件处理
React学习笔记(六)
五、事件处理
- React事件绑定属性的命名采用驼峰写法,不同于传统DOM全部小写。
- 如果采用JSX的语法,事件函数需要用大括号
{}
包裹函数名,不同于传统DOM字符串小括号的方式。
<button onClick={ activateLasers }>
Activate Lasers
</button>
- 在React中另一个不同是你不能使用返回
false
的方式阻止默认行为,必须明确使用preventDefault
来阻止。
function handleClick() {
e.preventDefault();
console.log('The link was clicked.');
}
return (
<a href="#" onClick={ handleClick }>
CLICK ME
</a>
);
React通常在元素初始渲染的时候提供一个事件,然后绑定给元素即可:
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {
isToggleOn: true
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={ this.handleClick }>
{ this.state.isToggleOn ? 'ON' : 'OFF' }
</button>
);
}
}
ReactDOM.render(
<Toggle />,
document.querySelector('#root')
);
注意这里使用了bind
方法来指向this
为当前类的实例。如果不想使用bind
可以使用【属性初始化器】来解决。
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {
isToggleOn: true
};
// this.handleClick = this.handleClick.bind(this);
}
// 这里使用了箭头函数
// React文档称为【属性初始化器】
// React文档推荐使用这两种方式
handleClick = () => {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
...
}
}
ReactDOM.render(
<Toggle />,
document.querySelector('#root')
);
还可以在回调函数中使用箭头函数(这样做可能有性能问题):
如果这个回调函数作为一个属性值传入低阶组件,这些组件可能会进行额外的重新渲染。
class Toggle extends React.Component {
constructor(props) {
...
}
handleClick() {
...
}
render() {
// 这里使用了箭头函数
return (
<button onClick={ e => this.handleClick(e) }>
{ this.state.isToggleOn ? 'ON' : 'OFF' }
</button>
);
}
}
ReactDOM.render(
<Toggle />,
document.querySelector('#root')
);
1. 向事件处理程序传递参数
两种方式:
- 箭头函数
<button onClick={ e => this.deleteRow(id, e) }>Delete Row</button>
- bind方法
<button onClick={ this.deleteRow.bind(this, id) }>Delete Row</button>
通过箭头函数传递的参数就是方法被调用写得顺序入参。
而bind方法传递的参数,整体排在e
事件对象前面:
class Popper extends React.Component {
constructor() {
super();
this.state = {
name: 'Hello world!',
id: '001'
};
}
preventPop(id, name, e) {
e.preventDefault();
alert(id + ': ' + name);
}
render() {
return (
<div>
<p>Pass Params</p>
{ /* Pass params via bind() method. */ }
<a href="https://google.com" onClick={ this.preventPop.bind(this, this.state.id, this.state.name) }>Click Me</a>
</div>
);
}
}
ReactDOM.render(
<Popper />,
document.querySelector('#root')
);
运行效果:
The end... Last updated by: Jehorn, April 15, 2019, 6:30 PM
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY