首页 > 其他分享 >react focus 事件

react focus 事件

时间:2024-05-27 14:25:14浏览次数:21  
标签:registerSimpleEvent const focus react 事件 focusin

react focus 事件

react 官网中说:“在 React 中所有事件都会传播,除了 onScroll,它仅适用于你附加到的 JSX 标签。”

https://react.docschina.org/learn/responding-to-events#event-propagation

那 focus 事件呢,原生 focus 事件可是非冒泡的

function MyInput() {
  function handleFocus(e) {
    console.log('focus', e);
  }
  return <input type="text" onFocus={handleFocus} />;
}

SyntheticBaseEvent 事件对象

const e = {
  bubbles: true,
  eventPhase: 3,
  type: 'focus',
  target: input,
  nativeEvent: {
    bubbles: true,
    type: 'focusin',
  },
};

从事件对象中可以看到,外层是 react 的自己的合成事件,原生事件在 nativeEvent 上,且监听的是 focusin 事件,focusin 事件是冒泡的。

瞅一眼源码:

const simpleEventPluginEvents = [事件数组];
export function registerSimpleEvents() {
  for (let i = 0; i < simpleEventPluginEvents.length; i++) {
    const eventName = ((simpleEventPluginEvents[i]: any): string);
    const domEventName = ((eventName.toLowerCase(): any): DOMEventName);
    const capitalizedEvent = eventName[0].toUpperCase() + eventName.slice(1);
    registerSimpleEvent(domEventName, 'on' + capitalizedEvent);
  }
  // Special cases where event names don't match.
  registerSimpleEvent(ANIMATION_END, 'onAnimationEnd');
  registerSimpleEvent(ANIMATION_ITERATION, 'onAnimationIteration');
  registerSimpleEvent(ANIMATION_START, 'onAnimationStart');
  registerSimpleEvent('dblclick', 'onDoubleClick');
  registerSimpleEvent('focusin', 'onFocus');
  registerSimpleEvent('focusout', 'onBlur');

  registerSimpleEvent(TRANSITION_RUN, 'onTransitionRun');
  registerSimpleEvent(TRANSITION_START, 'onTransitionStart');
  registerSimpleEvent(TRANSITION_CANCEL, 'onTransitionCancel');
  registerSimpleEvent(TRANSITION_END, 'onTransitionEnd');
}

所以在 input 标签上绑定 onFocus 属性时,内部监听的其实是 focusin 事件。
如果想在 react 上监听原生 focus 事件的话,是无法实现的。因为 simpleEventPluginEvents 数组中并未列出 focus。要不自己写原生代码监听 focus 吧。
react 如此设计的初衷是所有的事件都委托在根节点上,聚焦事件需要冒泡给根节点处理

网上说是委托在 document 上,但我并未发现

也许是 react 18 版本改了

标签:registerSimpleEvent,const,focus,react,事件,focusin
From: https://www.cnblogs.com/bibiafa/p/18215380

相关文章

  • react 脚手架
    react脚手架create-react-app(v5.0.1)临时安装create-react-app(node>14),通过create-react-app创建一个纯前端react项目npxcreate-react-appapp_01完成后package.json内容{"dependencies":{"@testing-library/jest-dom":"^5.17.0",......
  • React useState修改对象
    在React中,useState是一个Hook,它可以让函数组件拥有状态。当想要改变一个对象类型的状态时,我们需要使用展开运算符(...)或者Object.assign来确保状态是正确地更新。以下是一个使用useState来更新对象的例子://App.jsximportReact,{useState}from'react'f......
  • React useState数组新增和删除项
    在React中,我们可以使用useState钩子来管理组件的状态,其中包括数组。如何在React函数组件中对数组进行增加和删除项的操作?新增项时:我们可以对原数组进行解构,并把新增项一起加入到新数组;删除项时:我们使用Array.filter()进行筛选删除指定项,以下是一个简单的例子。//Ap......
  • Excel工作表单元格单击选中事件,VBA动态数值排序
    Excel工作表单元格单击选中事件,VBA动态数值排序(WX公众号:Excel潘谆白说VBA)文章目录前言一、运行效果二、代码前言面对每月的消费账单,面对月底待还的信用卡或花呗,面对不足三位数的余额,你是否怀疑过账单自己的消费。你是否因此开始记账,每个月记流水,想知道当月......
  • (读后分享)移动Web前端高效开发实战:HTML 5 + CSS 3 + JavaScript + Webpack + React Nat
    链接:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso提取码:jqsoHTML5新特性与应用:介绍HTML5的新特性,包括语义化标签、本地存储、设备兼容、连接特性等,并讲解如何在移动Web前端开发中充分利用这些特性提升用户体验。CSS3样式与动画设计:详细讲解CSS3的样式设计和动画效果,包......
  • C#面:如果出现ASP.NET中的事件不能触发可能由于什么原因造成
    当ASP.NET中的事件不能触发时,可能由以下几个原因造成:事件绑定错误:请确保事件正确地绑定到相应的控件上。在ASP.NET中,可以通过在前端代码或者后端代码中使用事件处理程序来绑定事件。如果事件没有正确地绑定到控件上,那么事件将无法触发。页面生命周期问题:ASP.NET页面有一......
  • 使用Autofit.js和React实现自适应布局
    1.什么是Autofit.js?Autofit.js是一个用于自适应网页布局的JavaScript库,它可以根据元素的尺寸和屏幕的大小,自动调整布局和排列方式,以适应不同的设备和分辨率。它提供了简单易用的API,可以帮助我们轻松实现各种自适应效果。2.如何在React中使用Autofit.js?首先,我们需要安装......
  • react 组件表格固定底部
    在React中,要实现一个组件表格并且固定底部,可以使用CSS的固定定位或绝对定位来实现。以下是一个简单的例子:importReactfrom'react';import'./App.css';functionApp(){return(<divclassName="App"><divclassName="table-container">......
  • react框架对Excel文件进行上传和导出
    1.首先需要安装xlsx第三方的库库引入插件npminstallxlsx在react引入import*asXLSXfrom'xlsx';1,首先设置jsx部分的 以下代码包含有导入excel文件和导出excel文件,读着可以根据需要,自己选择想要实现的功能 代码如下(示例)://importReactfrom'react';importR......
  • React后台管理(九)-- 页面开发前准备---Outlet布局组件封装
    文章目录前言一、组件源码+解析如下二、页面使用方式三、效果展示总结前言本文主要讲Outlet子路由渲染区域—>结构布局的封装。其中涉及的全局搜索hook函数,后面会单独拎出来讲,这期可先忽略,关注布局即可。一、组件源码+解析如下//@/layout/list/index.jsximport......