5、React组件事件详解
React组件事件响应
1、事件代理
2、事件自动绑定
2.在React中,每个事件处理回调函数都会自动绑定到组件实例(使用ES6语法创建的例外);
3、合成事件与浏览器事件处理稍微有不同的是,React中的事件处理程序所接收的事件参数是被称为 “合成事件(SyntheticEvent)”的实例。
使用JSX,在React中绑定事件: <button onClick={this.onClick}> 单击触发react事件 </button>
- boolean bubbles - boolean cancelable - DOMEventTarget currentTarget - boolean defaultPrevented - number eventPhase - boolean isTrusted - DOMEvent nativeEvent - void preventDefault() - boolean isDefaultPrevented() - void stopPropagation() - boolean isPropagationStopped() - DOMEventTarget target - number timeStamp - string type
React支持的常用事件1、剪贴板事件
2、键盘事件
3、焦点事件
4、表单事件
5、鼠标事件onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave onMouseMove onMouSEOut onMouSEOver onMouseUp
6、选择事件
7、触摸事件
8、UI事件
9、滚轮事件
10、图像事件
11、动画事件
12、其他事件
在React中使用原生事件
import React,{Component} from 'react'; import ReactDOM from 'react-dom' class ReactEvent extends Component { componentDidMount() { //获取当前真实DOM元素 const thisDOM = ReactDOM.findDOMNode(this); thisDOM.addEventListener('click',this.onDOMClick,false); } componentWillUnmount() { //卸载时解绑事件,防止内存泄漏 const thisDOM = ReactDOM.findDOMNode(this); thisDOM.removeEventListener('click',this.removeDOMClick); } onDOMClick(e){ console.log(e) } render(){ return( <div> 单击原始事件触发 </div> ) } } export default ReactEvent 合成事件和原生事件混合使用
import React,{Component} from 'react'; import ReactDOM from 'react-dom' class ReactEvent extends Component { constructor(props){ super(props) this.state = { value: '' } this.onReactClick = this.onReactClick.bind(this) } componentDidMount() { //获取当前真实DOM元素 const thisDOM = ReactDOM.findDOMNode(this); thisDOM.addEventListener('click',this.removeDOMClick); } onDOMClick(e){ console.log("原生事件绑定事件触发") } onReactClick(e){ console.log("React合成事件绑定事件触发") } render(){ return( <div onClick={this.onReactClick}> 单击事件触发 </div> ) } } export default ReactEvent
onDOMClick(e){ e.stopPropagation() console.log("原生事件绑定事件触发") }
import React,{Component} from 'react'; import ReactDOM from 'react-dom' class ReactEvent extends Component { constructor(props){ super(props) this.state = { value: '' } this.onReactClick = this.onReactClick.bind(this) this.onReactChildClick = this.onReactChildClick.bind(this) } componentDidMount() { //获取当前真实DOM元素 const thisDOM = ReactDOM.findDOMNode(this); thisDOM.addEventListener('click',false); //获取子元素并绑定事件 const thisDOMChild = thisDOM.querySelector(".child"); thisDOMChild.addEventListener('click',this.onDOMChildClick,false); } onDOMClick(e){ console.log("父组件原生事件绑定事件触发") } onReactClick(e){ console.log("父组件React合成事件绑定事件触发") } onDOMChildClick(e){ e.stopPropagation() console.log("子元素原生事件绑定事件触发") } onReactChildClick(e){ console.log("子元素React合成事件绑定事件触发") } render(){ return( <div onClick={this.onReactClick}> 父元素单击事件触发 <button className="child" onClick={this.onReactChildClick}>子元素单击事件触发</button> </div> ) } } export default ReactEvent
其实,React合成事件封装的stopPropagtion函数在调用时给自己加了个isPropagationStopped的标记位来确定后续监听器是否执行。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |