zoukankan      html  css  js  c++  java
  • react的事件绑定方式和事件合成机制

    class EventDemo extends React.Component {
        constructor(props) {
            super(props)
            this.state = {
                name: 'zhangsan',
            }
    
            // 修改方法的 this 指向
            this.clickHandler1 = this.clickHandler1.bind(this) //只绑定一次
        }
        render() {
            // this - 使用 bind
            return <p onClick={this.clickHandler1}>
                {this.state.name}
            </p>
        }
    
    }
    
    export default EventDemo

    2.使用静态方法,()=>{}

    class EventDemo extends React.Component {
        constructor(props) {
            super(props)
            this.state = {
                name: 'zhangsan',
            }
        }
        render() {
            // this - 使用静态方法
            return <p onClick={this.clickHandler2}>
                clickHandler2 {this.state.name}
            </p>
        }
        // 静态方法,this 指向当前实例
        clickHandler2 = () => {
            this.setState({
                name: 'lisi'
            })
        }
    }
    
    export default EventDemo

    3.传递参数- 用 bind(this, a, b)

    class EventDemo extends React.Component {
        constructor(props) {
            super(props)
            this.state = {
                name: 'zhangsan',
                list: [
                    {
                        id: 'id-1',
                        title: '标题1'
                    },
                    {
                        id: 'id-2',
                        title: '标题2'
                    },
                    {
                        id: 'id-3',
                        title: '标题3'
                    }
                ]
            }
        }
        render() {
            // 传递参数 - 用 bind(this, a, b)
            return <ul>{this.state.list.map((item, index) => {
                return <li key={item.id} onClick={this.clickHandler4.bind(this, item.id, item.title)}>
                    index {index}; title {item.title}
                </li>
            })}</ul>
        }
        // 传递参数
        clickHandler4(id, title, event) {
            console.log(id, title)
            console.log('event', event) // 最后追加一个参数,即可接收 event
        }
    }
    
    export default EventDemo

    4.React事件机制--合成事件机制

    看例子:

    class EventDemo extends React.Component {
        constructor(props) {
            super(props)
            this.state = {
            }
        }
        render() {
            // event
            return <a href="https://baidu.com/" onClick={this.clickHandler3}>
                click me
            </a>
        }
    
        // 获取 event
        clickHandler3 = (event) => {
            event.preventDefault() // 阻止默认行为
            event.stopPropagation() // 阻止冒泡
            console.log('target', event.target) // 指向当前元素,即当前元素触发
            console.log('current target', event.currentTarget) // 指向当前元素,假象!!!
    
            // 注意,event 其实是 React 封装的。可以看 __proto__.constructor 是 SyntheticEvent 组合事件
            console.log('event', event) // 不是原生的 Event ,原生的 MouseEvent
            console.log('event.__proto__.constructor', event.__proto__.constructor)
    
            // 原生 event 如下。其 __proto__.constructor 是 MouseEvent
            console.log('nativeEvent', event.nativeEvent)
            console.log('nativeEvent target', event.nativeEvent.target)  // 指向当前元素,即当前元素触发
            console.log('nativeEvent current target', event.nativeEvent.currentTarget) // 指向 document !!!
    
            // 1. event 是 SyntheticEvent ,模拟出来 DOM 事件所有能力
            // 2. event.nativeEvent 是原生事件对象
            // 3. 所有的事件,都被挂载到 document 上
            // 4. 和 DOM 事件不一样,和 Vue 事件也不一样
        }
    }
    
    export default EventDemo
        

    为什么要用合成事件机制?

                    更好的兼容性和跨平台-->native
                    载到document,减少内存消耗,避免频繁解绑
                    方便事件的统一管理(如事务机制)
  • 相关阅读:
    CloudStack tomcat集成方式分析
    cloudstack-setup-databases cs数据安装
    CloudStack 安装时需要的第三方包
    制作initramfs/initrd镜像
    GRUB使用说明
    Linux的kickstart安装详解
    cs4.1 编译与安装
    CS4.1 RPM打包函数分析
    Markdown 打出上下标
    matlab命令行双箭头消失
  • 原文地址:https://www.cnblogs.com/zhuMother/p/13236130.html
Copyright © 2011-2022 走看看