上节课我们对react
组件的三大属性做了一个回顾,这节课我们就继续往下学习了。今天我们来学习有关react
中的事件处理的相关课程。
事件处理概述
- 通过
onXxx
属性来指定事件处理函数(严格注意大小写) react
使用的是自定义事件,而不是原生DOM
事件react
中的事件是通过事件委托方式处理的- 通过
event.target
得到发生事件的DOM
元素对象
我们来分析一下上面这几句是什么意思:
第一个我们都知道,我们的原生DOM
用得是不是onclick
啊?而react
中用得是onClick
,但是为什么要这样呢?那原因就在下面。react
使用的是自定义(合成)事件,而不是原生DOM
事件。但是react
为什么要来做这种事儿呢?其实这是为了更好的兼容性。
react
中的事件是通过事件委托方式处理的。我们所有的onXxx
事件其实都委托给了组件的最外层元素,你看我们之前的代码:
class Demo extends React.Component { myRef=React.createRef(); showData = () => alert(this.myRef.current.value); render() { return( <div> <input ref={this.myRef} type="text" placeholder="click"/> <button onClick={this.showData} type="button">Click</button> </div> ); } }
我们给button
标签加的onClick
实际上都是加给了最外面这个<div>
。但是react
为什么要这么做呢?大家还记不记得事件委托的原理是什么?是不是事件冒泡?比如我们有一个<ul>
,里面有很多的<li>
,现在我们要给每一个<li>
都加点击事件,那我们会一个一个去加吗?我们肯定是加给<ul>
。然后即便点击的是每个<li>
,那么冒泡的话是会冒泡到<ul>
上的。那么为什么这么做呢?因为这样做是很高效的。
这就是react
的设计
我们再来看这一句:通过event.target
得到发生事件的DOM
元素对象。但是我们原生js
里面是不是也可以?原生js
里叫做发生事件的事件元。但是我们用这个干吗呢?我们回想一下学习refs
的时候,官方说过这么一段话:
就是说你不要动不动就写一个ref
,有些时候ref
是可以省略的。有人说了我们目前学习中用到的案例好像没有哪个ref
是可以省略的啊。那么我们来看一下:
class Demo extends React.Component { ... showData2 = (e) => alert(e.target.value); render() { return( <div> ... <input onBlur={this.showData2} type="text" placeholder="lose focus"/> </div> ); } }
大家看我上面那段代码,我是不是吧ref
省略了?为什么?我们这个事件发生事件的DOM
元素和我们要操作的DOM
元素是不是同一个啊?那这个ref
就可以省略。
你看当我们这个<input>
失去焦点的时候,react
是不是会去调showData2
?其实当调showData2
的时候会把事件元传(事件对象)进去,只不过我之前一直都没有接收过。现在我们来接收一下,那么我们也说了要通过event.target
来拿到DOM
元素然后再获取value
。那么我们来看一下效果:
大家看,我们去掉了这个ref
也一样成功拿到了我们想要的结果。所以说以后如果发生事件的DOM
元素和要操作的DOM
元素是同一个时就直接省略掉ref
。
啃又有人要问,那我的那个onClick
事件能不能也把ref
省略掉呢?以我们目前的学习和水平,还不行。如果后期到了某个程度,可能我们可以再回头看这个问题。
总结
- 不要过度使用
ref
- 事件监听要严格注意大小写
- 通过
event.target
获取到事件发生的DOM
元素
Copyright statement:The articles of this site are all original if there is no special explanation, indicate the source please when you reprint.
Link of this article:https://work.lynchow.com/article/react_event/