react中元素绑定enter事件

在项目中经常会遇到查询的功能,一般会要求有两种实现方式:一是在input输入完成后直接点击搜索按钮触发接口,二是input输入完成后直接按enter键触发接口,第一种方式很简单,这里主要写写第二种方式的处理

在js里绑定enter事件非常简单,直接在input里绑定onkeypress,onkeydown等事件,在事件里判断下e.keycode===13即可。

但是在react里,不能直接这样处理。这是因为react里的事件对象为 SyntheticEvent(合成对象),它是依据 DOM Level 3 的事件规范实现的,这样做最大的好处是可以屏蔽浏览器的差异,各种厂商的浏览器对规范的实现程度是不一样的,如果直接使用原生 DOM 事件对象的话,有些情况下你需要考虑浏览器的兼容性。而 React 通过 SyntheticEvent 已经把这些琐事帮你搞定了,在任何 React 支持的浏览器下,事件对象都有一致的接口。

React 中所有的事件处理函数都会接收到一个 SyntheticEvent 的实例 e 作为参数,如果在某些特殊的场景中,你需要用到原生的 DOM 事件对象,有两种方式可以解决。

简单的搜索页面
//html代码如下
<Input  ref={this.myRef} onKeyPress={this.handleEnterKey}/>
<Button onClick={this.onSearchText.bind(this)}> 查询</Button>

第一种:通过 e.nativeEvent 来获取。

下面是使用e.nativeEvent来处理react中绑定enter事件

constructor(props){
  this.myRef = React.createRef()
}
//搜索触发接口
onSearchText(){
   //当一个 ref 属性被传递给一个 render 函数中的元素时,
   // 可以使用 ref 中的 current 属性对节点的引用进行访问。
    let val = this.myRef.current.input.value
    if(!val.trim()){
         message.warn('请输入搜索内容后再点击搜索按钮')
         return false
     }
    //这里是触发查询的接口
     this.props.matchHistory.getHistoryList(val)
}
//判断点击的键盘的keyCode是否为13,是就调用上面的搜索函数
handleEnterKey = (e) => {
    if(e.nativeEvent.keyCode === 13){ //e.nativeEvent获取原生的事件对像
         this.onSearchText()
    }
}

第二种:通过addEventListener注册事件

注意:在react中要慎用addEventListener

React 内部自己实现了一套高效的事件机制,为了提高框架的性能,React 通过 DOM 事件冒泡,只在 document 节点上注册原生的 DOM 事件,React 内部自己管理所有组件的事件处理函数,以及事件的冒泡、捕获。

如果你通过 addEventListener 注册了某个 DOM 节点的某事件处理函数,并且通过 e.stopPropagation(); 阻断了事件的冒泡或者捕获,那么该元素下的所有节点中同类型的 React 事件处理函数都会失效。所以要慎用addEventListener注册事件,明确你自己注册的事件不会导致其他事件失效即可。

下面是使用注册事件方法

constructor(props){
  this.myRef = React.createRef()
}
componentDidMount(){ 
    //组件挂载时候,注册keypress事件
    document.addEventListener('keypress',this.handleEnterKey)
}
componentWillUmount(){
   //组件卸载时候,注销keypress事件
   document.removeEventListener("keypress",this.handleEenterKey)
}
//搜索触发接口
onSearchText(){
   //当一个 ref 属性被传递给一个 render 函数中的元素时,
  // 可以使用 ref 中的 current 属性对节点的引用进行访问。
    let val = this.myRef.current.input.value
    if(!val.trim()){
         message.warn('请输入搜索内容后再点击搜索按钮')
         return false
     }
    //这里是触发查询的接口
     this.props.matchHistory.getHistoryList(val)
}
//判断点击的键盘的keyCode是否为13,是就调用上面的搜索函数
handleEnterKey = (e) => {
    if(e.keyCode === 13){ //主要区别就是这里,可以直接获取到keyCode的值
         this.onSearchText()
    }
}

这里有点需要注意,我直接将事件注册到document上了,这里会导致在页面其他地方点击enter键也会触发搜索事件,所以在实际项目里要将事件注册到input(或者你想要绑定的元素)上面。

倘若你在react里直接绑定enter事件,没有处理事件,在handleEnterKey里获取的e会如下图,这样是没办法绑定enter事件的,因为这里的keyCode压根不是值,而是一个函数,所以e.keyCode === 13就为false了。

合成事件对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267