zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Use Visual studio 2010 build Python2.7.10
    ext4 disable journal
    ElasticSearch优化配置
    重载Python FTP_TLS 实现Implicit FTP Over TLS方式下载文件
    linux下对进程按照内存使用情况进行排序
    python 树遍历
    E: Unable to correct problems, you have held broken packages 解决方法
    C++ Lambda 表达式使用详解
    C++ 14 新特性总结
    Log4j配置
  • 原文地址:https://www.cnblogs.com/jehorn/p/10712252.html
Copyright © 2011-2022 走看看