react中的事件处理

DOM中的事件绑定有三种方式:

方式1:DOM0级别的事件绑定

   <body>
       <button id="btn">点我</button>
       <script>
           // DOM0级别的事件绑定
           let btn = document.getElementById("btn");
           btn.onclick = function(){
               console.log("点我干啥~");
           }
       </script>
   </body>

方式2:DOM2级别的事件绑定

    <body>
        <button id="btn">点我</button>
        <script>
            // DOM0级别的事件绑定
            let btn = document.getElementById("btn");
            btn.addEventListener("click",()=>{
                console.log("点我干啥~");
            })
        </script>
    </body>

方式3:HTML级别的事件绑定(方法后必须加括号)

   <body>
       <button id="btn" onclick="fn()">点我fn()</button>
       <button id="btn" onclick="fn">点我fn</button>  不加()OK
       <script>
           function fn(){
               console.log("点我干啥~");
           }
       </script>
   </body>

react中的事件绑定

在react事件处理中,this问题很重要。

处理this问题:
1)监听器可以变成箭头函数,在不传递参数的情况下,可以这样绑定:onClick={ this._clickHandle }
2)在构建函数(constructor)中,可以使用bind,对this进行绑定,绑定:onClick={ this._clickHandle } 不能传参
3)直接在使用监听时绑定 onClick={ this._clickHandle.bind(this,1,2) }

class MyCom extends Component{
    constructor(){
        super();
        this.state = {
            isHot:false
        }
        // bind返回一个改变了this指向的新函数
        this._clickHandle =  this._clickHandle.bind(this)
    }
    render(){
        let { isHot } = this.state
        return (
            <div>
                <h1>今天天气很{isHot ? "炎热" : "寒冷"}</h1>
                {/* onClick是React中对原生DOM中的onclick又一次封装 */}
                {/* <button onClick={ this._clickHandle }>切换</button> */}

                {/* 这里面的调用的_clickHandle是调用16行的_clickHandle */}
                <button onClick={ this._clickHandle }>切换</button>
            </div>
        )
    }
    _clickHandle(){
        console.log(this);  
        let { isHot } = this.state
        // 更新状态机
        this.setState({
            isHot:!isHot
        })
    }
} 

4)推荐写法:onClick={ (e)=> this._clickHandle(111,222,e) }

class MyCom extends Component{
   constructor(){
       super();
       this.state = {
           isHot:false
       }
   }
   render(){
       let { isHot } = this.state
       return (
           <div>
               <h1>今天天气很{isHot ? "炎热" : "寒冷"}</h1>
               <button onClick={ (e)=> this._clickHandle(111,222,e) }>切换</button>
               <a href="xxx" onClick={ (e)=> this._clickHandle(111,222,e) }>切换</a>
           </div>
       )
   }
   _clickHandle(a,b,e){
       console.log(a,b,e);
       e.preventDefault(); // 阻止默认事件
       console.log(this);  
       let { isHot } = this.state
       // 更新状态机
       this.setState({
           isHot:!isHot
       })
   }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值