作者:淀死鈊 | 来源:互联网 | 2023-09-24 11:42
web前端|js教程javascript,react.jsweb前端-js教程这篇文章给大家介绍的内容是关于ReactEvent事件注册的实现,有着一定的参考价值,有需要的朋友可以
web前端|js教程
Javascript,react.js
web前端-js教程
这篇文章给大家介绍的内容是关于React Event事件注册的实现,有着一定的参考价值,有需要的朋友可以参考一下。
途牛app源码,vscode上面可以切图吗,ubuntu中文 home,tomcat下服务卡死,dht爬虫 源码,php ezpdo,湖南百度seo优化价位lzw
React 元素的事件处理和 DOM元素的很相似。但是有一点语法上的不同:
php jymusic音乐源码,ubuntu界面偏左,注册表没有tomcat,爬虫入门项目,php svn服务器搭建,SEO中mc推广是什么意思lzw
React事件绑定属性的命名采用驼峰式写法,而不是小写。
记账软件app源码,vscode窗口栏,ubuntu触屏模式,tomcat启动war,sqlite数据集,jquery分享插件,crm前端用什么框架,scrapy反爬虫,php net,火狐插件seo,织梦部队新闻网站模板,网页二级菜单代码,jquery注册页面模板,一边加载页面一边弹框,asp文章管理系统 手机,卡密在线充值源码程序lzw
如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法)
并且 React 自己内部实现了一个合成事件,使用 React 的时候通常你不需要使用 addEventListener 为一个已创建的 DOM 元素添加监听器。你仅仅需要在这个元素初始渲染的时候提供一个监听器。
我们看一下这是怎么实现的
React 事件机制分为 事件注册,和事件分发,两个部分
事件注册
// 事件绑定function handleClick(e) { e.preventDefault(); console.log('The link was clicked.');} return ( Click me );
上述代码中, onClick 作为一个 props 传入了一个 handleClick,在组件更新和挂载的时候,会对props处理, 流程如下:
核心代码:
在 ReactDOMComponent.js 进行组件加载 (mountComponent)、更新 (updateComponent) 的时候,调用 _updateDOMProperties
方法对 props 进行处理:
ReactDOMComponent.js
_updateDOMProperties: function(lastProps, nextProps, transaction) {...if (registrationNameModules.hasOwnProperty(propKey)) { if (nextProp) { // 如果传入的是事件,去注册事件 enqueuePutListener(this, propKey, nextProp, transaction); } else if (lastProp) { deleteListener(this, propKey); } } ...}// 注册事件function enqueuePutListener(inst, registrationName, listener, transaction) { var cOntainerInfo= inst._nativeContainerInfo; var doc = containerInfo._ownerDocument; ... // 去doc上注册 listenTo(registrationName, doc); // 事务结束之后 putListener transaction.getReactMountReady().enqueue(putListener, { inst: inst, registrationName: registrationName, listener: listener, });}
看下绑定方法
ReactBrowserEventEmitter.js
listento
//registrationName:需要绑定的事件//当前component所属的document,即事件需要绑定的位置listenTo: function (registrationName, contentDocumentHandle) { var mountAt = contentDocumentHandle; //获取当前document上已经绑定的事件 var isListening = getListeningForDocument(mountAt); ... if (...) { //冒泡处理 ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(...); } else if (...) { //捕捉处理 ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(...); } ... },
走到最后其实就是 doc.addEventLister(event, callback, false);
可以看出所有事件绑定在document上
所以事件触发的都是ReactEventListener的dispatchEvent方法
回调事件储存
listenerBank
react 维护了一个 listenerBank 的变量保存了所有的绑定事件的回调。
回到之前注册事件的方法
function enqueuePutListener(inst, registrationName, listener, transaction) { var cOntainerInfo= inst._nativeContainerInfo; var doc = containerInfo._ownerDocument; if (!doc) { // Server rendering. return; } listenTo(registrationName, doc); transaction.getReactMountReady().enqueue(putListener, { inst: inst, registrationName: registrationName, listener: listener, });}
当绑定完成以后会执行putListener。
var listenerBank = {};var getDictiOnaryKey= function (inst) {//inst为组建的实例化对象//_rootNodeID为组件的唯一标识 return '.' + inst._rootNodeID;}var EventPluginHub = {//inst为组建的实例化对象//registrationName为事件名称//listner为我们写的回调函数,也就是列子中的this.autoFocus putListener: function (inst, registrationName, listener) { ... var key = getDictionaryKey(inst); var bankForRegistratiOnName= listenerBank[registrationName] || (listenerBank[registrationName] = {}); bankForRegistrationName[key] = listener; ... }}
EventPluginHub在每个React中只实例化一次。也就是说,项目组所有事件的回调都会储存在唯一的listenerBank中。
相关推荐:
React的使用:React组件内部的状态管理
React的使用:react框架的五大特点