博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react SyntheticEvent 合成事件机制
阅读量:4952 次
发布时间:2019-06-12

本文共 2091 字,大约阅读时间需要 6 分钟。

在弄懂react SyntheticEvent 之前我遇到了一个问题,这个问题一直困扰我很久,知道我看了这篇之后,参考了react 文档,总算弄的大致明白。
首先看一下我的问题。
当我需要在一个点击事件中应用debounce函数(防抖函数)在防止点击事件的多次误触情况是我的第一反应是这样的
options.map(item => {  let option = (    
  • {item.displayName}
  • ); if (item.type === "DIMENSION") { demension.push(option); } else { mersure.push(option); }}); handleClick(e) { let { seriesIndex } = this.state; let key = e.target.getAttribute("data-name”); ...}
    这个时候浏览器会报出异常:TypeError: Cannot read property 'getAttribute' of null
    检查event对象可以看到target 为null,但是用了debounce 函数之后会出现获取不到event.target的情况呢?接下来需要介绍下react 的合成事件机制。

    合成事件(SyntheticEvent)

    事件处理程序通过 合成事件(SyntheticEvent)的实例传递,SyntheticEvent 是浏览器原生事件跨浏览器的封装。SyntheticEvent 和浏览器原生事件一样有 stopPropagation()、preventDefault() 接口,而且这些接口夸浏览器兼容。 如果由于某种原因发现您需要基础浏览器事件,只需使用该nativeEvent属性即可获取它。每个SyntheticEvent对象都具有以下属性:
    boolean bubblesboolean cancelableDOMEventTarget currentTargetboolean defaultPreventednumber eventPhaseboolean isTrustedDOMEvent nativeEvent  // 原生事件对象void preventDefault()boolean isDefaultPrevented()void stopPropagation()boolean isPropagationStopped()DOMEventTarget targetnumber timeStampstring type
     

    事件池

    将SyntheticEvent被合并。这意味着SyntheticEvent在调用事件回调之后,将重用该对象并且所有属性都将无效。这是出于性能原因。因此,您无法以异步方式访问事件。
    function onClick(event) {  console.log(event); // => nullified object.  console.log(event.type); // => "click"  const eventType = event.type; // => "click"   setTimeout(function() {    console.log(event.type); // => null    console.log(eventType); // => "click"  }, 0);   // Won't work. this.state.clickEvent will only contain null values.  this.setState({clickEvent: event});   // You can still export event properties.  this.setState({eventType: event.type});}
    注意:如果要以异步方式访问事件属性,则应调用event.persist(),该方法将从池中删除合成事件,并允许用户代码保留对事件的引用。 可以看到react 文档的注意这里给我我们解决办法,因为我们在使用debounce函数时,其内部实际上是使用setTimeout异步调用回调函数,所以直接在debounce函数内部获取外部的event对象是不能直接拿到的,这时调用event.persist()就可以拿到事件的引用。
     
    参考:

    在 react 组件中使用 debounce 函数(http://billqiu.github.io/2017/10/15/how-to-debounce-in-react/)

    SyntheticEvent(https://reactjs.org/docs/events.html?)

     

     
     
     
     
     
     
     

    转载于:https://www.cnblogs.com/chrissong/p/10432010.html

    你可能感兴趣的文章
    定宽320 缩放适配手机屏幕
    查看>>
    BZOJ 2120 数颜色 【带修改莫队】
    查看>>
    【noip2004】虫食算——剪枝DFS
    查看>>
    Codeforces 40 E. Number Table
    查看>>
    CLR via C#(第3 版)
    查看>>
    java语法之final
    查看>>
    关于响应式布局
    查看>>
    详解ASP.Net 4中的aspnet_regsql.exe
    查看>>
    python 多进程和多线程的区别
    查看>>
    hdu1398
    查看>>
    [android] 网络断开的监听
    查看>>
    156.Binary Tree Upside Down
    查看>>
    MongoDB在windows下安装配置
    查看>>
    Upselling promotion stored procedure
    查看>>
    mysql编码配置
    查看>>
    KVM地址翻译流程及EPT页表的建立过程
    查看>>
    sigar
    查看>>
    iOS7自定义statusbar和navigationbar的若干问题
    查看>>
    c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码...
    查看>>
    程序员如何提高影响力:手把手教你塑造个人品牌
    查看>>