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')
);

53f30ff207adbc784cff865fe449dd1b.gif

注意这里使用了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')
);

运行效果:

9eb0849f608ae79aa4c04f255ef915e6.gif

The end... Last updated by: Jehorn, April 15, 2019, 6:30 PM

posted @   古宝只  阅读(272)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示