react-原生事件和合成事件的区别及源码分析
概念
class EventClickDemo extends React.Component {
constructor(props) {
super(props)
this.btnRef = React.createRef()
}
componentDidMount() {
// 这里就是js原生事件
this.btnRef.current.addEventListener('click', function(e) {
console.log('native event')
console.log(e)
})
}
handleClick(event) {
// 这里就是合成事件,指的是react封装的SyntheticEvent
console.log('react event')
console.log(event)
}
render() {
return (
<div onClick={this.handleClick} ref={this.btnRef}>Click me</div>
)
}
}
关于 react 合成事件
目的:
- 封装事件,实现跨平台,把差异封装在底层
- 将事件全部统一冒泡到 document 再进行触发
- 可以统一命名,这样子命名符合 react 编程习惯,比如点击事件 onClick,点击事件(捕获阶段)onClickCapture
api:
boolean bubbles // 是否冒泡
boolean cancelable // 是否可以取消
DOMEventTarget currentTarget
boolean defaultPrevented
number eventPhase
boolean isTrusted
DOMEvent nativeEvent // 相当于原生事件的event
void preventDefault() // 封装的阻止默认行为
boolean isDefaultPrevented()
void stopPropagation() // 阻止冒泡
boolean isPropagationStopped() // 是否设置了阻止冒泡
void persist()
DOMEventTarget targe