首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我想在Reactjs中添加addEventListener(),通过它,如果我在这个模型之外单击,模型就会接近

在React.js中添加addEventListener()来实现在模型之外点击时关闭模型的功能,可以通过以下步骤实现:

基础概念

addEventListener()是一个JavaScript方法,用于在指定元素上注册一个事件处理程序。当指定的事件发生时,事件处理程序会被调用。

相关优势

  1. 灵活性:可以针对特定元素添加事件监听器。
  2. 精确控制:可以指定事件类型和处理函数。
  3. 兼容性:几乎所有现代浏览器都支持该方法。

类型与应用场景

  • 类型:常见的事件类型包括点击事件(click)、鼠标移动事件(mousemove)等。
  • 应用场景:弹出框、模态框、提示框等需要用户交互的场景。

示例代码

以下是一个在React.js中实现点击模型外部关闭模型的示例:

代码语言:txt
复制
import React, { useEffect, useRef } from 'react';

const Modal = ({ isOpen, onClose }) => {
  const modalRef = useRef(null);

  useEffect(() => {
    const handleClickOutside = (event) => {
      if (modalRef.current && !modalRef.current.contains(event.target)) {
        onClose();
      }
    };

    if (isOpen) {
      document.addEventListener('mousedown', handleClickOutside);
    }

    return () => {
      document.removeEventListener('mousedown', handleClickOutside);
    };
  }, [isOpen, onClose]);

  if (!isOpen) return null;

  return (
    <div ref={modalRef} style={{ border: '1px solid black', padding: '20px', margin: '20px' }}>
      <h2>Modal Content</h2>
      <button onClick={onClose}>Close</button>
    </div>
  );
};

const App = () => {
  const [isModalOpen, setIsModalOpen] = React.useState(false);

  return (
    <div>
      <button onClick={() => setIsModalOpen(true)}>Open Modal</button>
      <Modal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} />
    </div>
  );
};

export default App;

解释

  1. useRef:用于创建一个引用,指向模态框的DOM元素。
  2. useEffect:在组件挂载和卸载时执行副作用操作。这里用于添加和移除事件监听器。
  3. handleClickOutside:这是一个事件处理函数,当点击事件发生在模态框外部时,调用onClose函数关闭模态框。

可能遇到的问题及解决方法

  1. 事件监听器未移除:确保在组件卸载时移除事件监听器,以避免内存泄漏。
  2. 事件监听器未移除:确保在组件卸载时移除事件监听器,以避免内存泄漏。
  3. 点击事件冒泡:如果模态框内部也有点击事件,可能会触发外部点击事件。可以通过阻止事件冒泡来解决。
  4. 点击事件冒泡:如果模态框内部也有点击事件,可能会触发外部点击事件。可以通过阻止事件冒泡来解决。

通过以上步骤和代码示例,你可以在React.js中实现点击模型外部关闭模型的功能,并解决可能遇到的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用纯 JavaScript 撸一个 MVC 框架

在这个 todo 程序中,这将是实际的待办事项,以及将添加、编辑或删除它们的方法。 视图是数据的显示方式。在这个程序中,是 DOM 和 CSS 中呈现的 HTML。 控制器用来连接模型和视图。...它需要用户输入,例如单击或键入,并处理用户交互的回调。 模型永远不会触及视图。视图永远不会触及模型。控制器用来连接它们。 我想提一下,为一个简单的 todo 程序做 MVC 实际上是一大堆样板。...mvc1 这对于现在的模型来说已经足够了。最后我们会将待办事项存储在 local storage 中,以使其成为半永久性的,但现在只要刷新页面,todo 就会刷新。...控制台仍然作为临时控制器存在,你可以通过它添加和删除待办事项。 ? mvc3 控制器 最后,控制器是模型(数据)和视图(用户看到的内容)之间的链接。这是我们到目前为止控制器中的内容。...在模型中,为 onTodoListChanged 添加 bindEvents。

3.3K41

JavaScript事件详解

然后是实际的目标接收到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应 如图所示:事件捕获(123)和事件冒泡(4567) 为了更好的说明DOM标准中的事件流原理,我们把它放在“事件传送...显然,如果为一个超链接添加了click事件监听器,那么当该链接被点击时该事件监听器就会被执行。...一般就是一次性将父元素绑定事件,通过判断event.target 来执行相应的方法,后续添加子元素的时候不用再次绑定。...在JavaScript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,因为需要不断的与dom节点进行交互,访问dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间...,是对象就会占用内存,对象越多,内存占用率就越大,自然性能就越差了,比如上面的100个li,就要占用100个内存空间,如果是1000个,10000个呢,那只能说呵呵了,如果用事件委托,那么我们就可以只对它的父级

71810
  • React v17有什么新功能?

    React 团队承诺 v17 版本的发布对未来非常重要,但也提到没有添加新特性。你可能想知道它为什么会被发布。 在本文中,我将列出最新版本中所做的更改。 正文 为什么没有新功能?...因此,如果新更新中引入了重大更改,并且您打算迁移到新版本,则必须更改代码库,尤其是在代码库很大的情况下。 React 团队已使用React 17 解决了这些问题中的大多数问题。...它仍然提供一些好处,例如: 您不需要导入 React 改善捆绑包尺寸 如果您想阅读更多有关此新转换的信息,请查看React团队的这篇博客文章:https://reactjs.org/blog/2020/...没有事件处理池 在这个版本中,事件池优化已经从 React 中删除,这是由于它非常混乱以及并没有提高性能 function handleChange(e) { setData(data => ({...; } 最初,这种行为只适用于类和函数组件,但是在新版本中,forwardRef memo 组件也加入了这个功能,使它们的行为与常规的类和函数组件一致,请注意,如果您故意不进行任何渲染

    2.6K31

    怎么创建 JavaScript 自定义事件

    在最基本的形式中,你只需要将一个字符串传递给构造函数,这个字符串就是你定义的事件名称。...每个元素都有这个方法,你要做的就是将你创建的对象传递给它。 如果我们将上面讲的组合在一起,我们就得到了一个基本的事件,这个事件在我们的 document 元素触发,相关的事件内容会被打印出来。...图中是这个事件对象的最基本形式。它包含大量信息,最重要的部分我这里突出显示了。 isTrusted 属性仅指该事件是由用户交互触发,还是由自定义 JavaScript 代码触发的。...如果你想在影子 DOM 中触发的事件可以在影子 DOM 外被捕捉到,就将其设置为 true。...,我们将创建一个双击的事件,只要你在短时间内单击一个元素,就会触发该事件。

    1.4K10

    【译】用纯JavaScript写一个简单的MVC App

    此时,如果你通过控制台手动键入所有操作并在控制台中查看输出,则你的app具备了功能全面的CRUD。 View 我们将通过操作DOM(文档对象模型)来创建视图。...在构造器中,我将设置我所需的全部内容。...控制台仍然作为临时控制器存在,你可以通过它添加和删除待办事项。 ? Controller 最后,控制器是模型(数据)和视图(用户所见)之间的连接。到目前为止,下面就是控制器中的内容。...我们也可以在构造函数中调用一次,以显示初始待办事项,如果有。...我决定在视图上创建一个方法,用新的编辑值更新一个临时状态变量,然后在视图中创建一个方法,该方法在控制器中调用handleEditTodo方法来更新模型。

    2K10

    JavaScript小技能:事件

    在现代浏览器中,默认情况下,所有事件处理程序都在冒泡阶段进行注册。 捕获阶段:浏览器检查元素的最外层祖先,是否在捕获阶段中注册了一个onclick事件处理程序,如果是,则运行它。...然后,它移动到中单击元素的下一个祖先元素,并执行相同的操作,依此类推,直到到达实际点击的元素。...冒泡阶段:浏览器检查实际点击的元素是否在冒泡阶段中注册了一个onclick事件处理程序,如果是,则运行它。然后它移动到下一个直接的祖先元素,并做同样的事情,直到它到达元素。...事件委托: 如果你想要在大量子元素中单击任何一个都可以运行一段代码,您可以将事件监听器设置在其父节点上,并让子节点上发生的事件冒泡到父节点上,而不是每个子节点单独设置事件监听器。...; } 通过DOM Level 2 Events 函数 addEventListener()关联事件处理器 (只支持到 Internet Explorer 9) 可以在一个元素上多次调用addEventListener

    1.4K10

    React 17 RC 版发布:无新特性,却有新期待!

    在 Facebook 内部,我们总共得调整约 10 个模块(从成千上万个模块中)以适应此变更。 例如,如果你使用 document.addEventListener(...)...e.stopPropagation() 的 React 中 // 这个自定义处理器将不会再接受 click 事件 }); 你可以通过把你的监听器转换到 capture 阶段来修复此类代码。...- 举个例子,如果你的代码在 React 事件处理器之外调用 e.stopPropagation() 时出了 bug, 它可能会修复代码中的错误。...不过,它仍然比不上原生 JavaScript 堆栈。甚至它们在控制台中并不可单击,因为 React 不知道该函数在源代码中声明在哪里。此外,它们在生产环境中几乎没有用。...在 React 17 中,组件堆栈是通过不同的机制生成的,该机制将组件堆栈与原生 JavaScript 堆栈简单结合在一起。这使你可以在生产环境中获得完全符号化的 React 组件堆栈跟踪。

    2.4K20

    Web 框架的替代方案

    在 ReactJS 和 SolidJS 中,我们会创建声明性代码,并将其转化为命令性代码,向 DOM 中加入标签或者删除标签。在 Svelte 中,生成这些代码。...我怎么知道某个东西是否需要成为表单元素?作为一个经验法则,如果它与模型中的数据绑定,那么它就应该是一个表单元素。...当任务被添加时,这个表单将通过克隆模板的内容而被重复。 隐藏的输入表示不直接显示的数据,但用于样式设计和选择。 注意这个 DOM 是如何简洁的。它没有在其元素中散布类。...CSS 处理了规范中的很多要求(做了一些有利于无障碍的修正)。我们来看看一些示例。 根据规范,“X”(destroy)按钮只在悬停时显示。我还添加了一个辅助位,使它在任务被聚焦时可见。...我选择在 CSS 中实现这个简单的过滤器,以显示它能走多远,但如果它开始变得棘手,那么把它移到模型中是完全有意义的。

    2.6K10

    super(props) 真的那么重要吗?

    但是假如你想更深入的了解它的运作方式,就会发现实际上它们很有趣。 开始第一个。 ---- 首先在我的职业生涯中写过的 super(props) 自己都记不清: ?...接下来我们试一试: ---- 在 JavaScript 中,super 指的是父类的构造函数。(在我们的示例中,它指向React.Component的实现。)...先看下面这个类的层次结构: ? 如果允许在调用 super 之前使用this的话,一段时间后,我们可能会修改 greetColleagues,并在提示消息中添加 Person的 name: ?...当 React 添加对类的支持时,它不仅仅增加了对 ES6 类的支持。它的目标是尽可能广泛的支持类抽象。...如果这种情况发生在从构造函数调用的某个方法中,可能会给调试工作带来很大的麻烦。 这就是为什么我建议总是调用 super(props) ,即使在没有必要的情况之下: ?

    1.3K50

    人工智能|基于 TensorFlow.js 的迁移学习图像分类器

    里请使用有用的图片地址 在浏览器中设置 MobileNet 用于预测 在代码编辑器中打开/创建index.js 文件,添加以下代码: let net;async function app(){ console.log...通过网络摄像头图像在浏览器中执行 MobileNet 预测 接下来,我们来设置网络摄像头来预测由网络摄像头传输的图像。 现在,让我们让它更具交互性和实时性。...app() 函数中,你可以删除通过图像预测的部分,用一个无限循环,通过网络摄像头预测代替。...在 MobileNet 预测的基础上添加一个自定义的分类器 现在,让我们把它变得更加实用。我们使用网络摄像头动态创建一个自定义的 3 对象的分类器。...每次单击其中一个 "Add" 按钮,就会向该类添加一个图像作为训练实例。当你这样做的时候,模型会继续预测网络摄像头的图像,并实时显示结果。

    1.3K41

    关于 JavaScript 错误处理的最完整指南(上半部)

    如果你重新赋值给 const 声明的变量时,就会引发 TypeError 错误。...如果异常未被捕获,也就是说,程序员不采取任何措施来捕获它,程序将崩溃。 何时何地捕获代码中的异常取决于特定的用例。 例如,我们可能想在堆栈中传递一个异常,以使程序完全崩溃。...接下来,我们来看看 JavaScript 同步和异步中的错误和异常处理。 同步中的错误处理 同步代码在大多数情况下都很简单,因此它的错误处理也很简单。...要从生成器中提取值,我们可以使用两种方法: 使用 next() 方法 通过 for...of 遍历 如下所示,要想在生成器中获取值,我们可以这样做: function* generate() { yield...; }); 在这里,单击按钮后立即引发异常。 我们如何抓住它?

    1.7K30

    JS事件流

    事件捕获的用意在于事件达到预定目标之前捕获它。 如 1....中所述案例,则单击 div 元素后,事件触发顺序如下: document html body div 也就是在事件捕获过程中,document 对象首先接收到 click 事件,然后事件沿 DOM 树向下依次传播...还以上述代码为例,单击 div 元素后的触发顺序则是: ?...DOM事件流 在 DOM 事件流中,实际目标(div)在捕获阶段不会接收到事件,意味着在捕获阶段事件从 document 到 html 再到 body 就会停止。...输出结果 可是,当我们将子级的冒泡和捕获在js中位置调换后,输出的则是……子级先冒泡,再捕获!如下: ? 输出结果2 这是什么原因呢?? 下期——事件处理顺序,进一步揭晓。

    5.8K10

    Javascript 面试中经常被问到的三个问题!

    相反,在讨论 JavaScript 时,面试中通常会提到三件事。我自己也被问到这些问题,我的朋友们告诉我他们也被问到这些问题。...这对于目前 4 个元素来说,没什么大问题,但是如果在待办事项列表中添加了 10,000 项(他们可能有很多事情要做)怎么办?...在面试中,最好先问面试官用户可以输入的最大元素数量是多少。例如,如果它不超过 10,那么上面的代码就可以很好地工作。但是如果用户可以输入的条目数量没有限制,那么你应该使用一个更高效的解决方案。...如果你的应用程序最终可能有数百个事件侦听器,那么更有效的解决方案是将一个事件侦听器实际绑定到整个容器,然后在单击它时能够访问每个列表项, 这称为 事件委托,它比附加单独的事件处理程序更有效。...总结下来,所谓的“节流”,是通过在一段时间内无视后来产生的回调请求来实现的。只要 裁判宣布比赛开始,裁判就会开启计时器,在这段时间内,参赛者就尽管不断的吃,谁也无法知道最终结果。

    87320

    常见的三个 JS 面试题

    相反,在讨论 JavaScript 时,面试中通常会提到三件事。我自己也被问到这些问题,我的朋友们告诉我他们也被问到这些问题。...这对于目前 4 个元素来说,没什么大问题,但是如果在待办事项列表中添加了 10,000 项(他们可能有很多事情要做)怎么办?...在面试中,最好先问面试官用户可以输入的最大元素数量是多少。例如,如果它不超过 10,那么上面的代码就可以很好地工作。但是如果用户可以输入的条目数量没有限制,那么你应该使用一个更高效的解决方案。...如果你的应用程序最终可能有数百个事件侦听器,那么更有效的解决方案是将一个事件侦听器实际绑定到整个容器,然后在单击它时能够访问每个列表项, 这称为 事件委托,它比附加单独的事件处理程序更有效。...总结下来,所谓的“节流”,是通过在一段时间内无视后来产生的回调请求来实现的。只要 裁判宣布比赛开始,裁判就会开启计时器,在这段时间内,参赛者就尽管不断的吃,谁也无法知道最终结果。

    1.3K20

    web前端常见面试题

    标准模式不包含,标准模式下可以通过设置 box-sizing: border-box 将标准盒模型转化成怪异模式下的盒模型。 怪异模式下,当内容超出容器高度时,会将容器拉伸,而不是溢出。...理由如下: 当鼠标悬停在未访问的链接上时,:link 和 :hover 都会命中,如果 :hover 在 :link 之前声明,那么(:hover)就会被覆盖; 当鼠标悬停在已访问的连接上时,:visited...和 :hover 都会命中,如果 :hover 在 :visited 之前声明,那么(:hover)就会被覆盖; 当鼠标单击链接时,:active 和 :hover 都会命中,我们大多是想让 :hover...捕获阶段的行为: 浏览器检查元素的最外层祖先,是否在捕获阶段中注册了一个onclick事件处理程序,如果是,则运行它; 然后,它移动到中单击元素的下一个祖先元素,并执行相同的操作...,然后是单击元素再下一个祖先元素,依此类推,直到到达实际点击的元素; 而冒泡与捕获恰恰相反: 浏览器检查实际点击的元素是否在冒泡阶段中注册了一个onclick事件处理程序,如果是,则运行它; 然后它移动到下一个直接的祖先元素

    2.3K20

    把 React 作为 UI 运行时来使用

    在本文中,我会从最佳原则的角度尽可能地阐述 React 编程模型。我不会解释如何使用它 —— 而是讲解它的工作原理。...我们称它为“宿主树”,因为它往往是 React 之外宿主环境中的一部分 —— 就像 DOM 或 iOS 。宿主树通常有它自己的命令式 API 。而 React 就是它上面的那一层。...现在,在父组件 中调用 setState 时如果 中的 item 与先前渲染的结果是相同的,React 就会直接跳过协调的过程。...例如浏览器中的 addEventListener API 非常快,但为了在组件中避免使用它可能会带来更多的问题而不是其真正的价值。...在你忘记添加 key 这样的属性时,React 能够好心提醒你。 如果你是一个痴迷于 UI 库的书呆子,我希望这篇文章对你来说会很有趣的,并且深入阐明了 React 的工作原理。

    2.5K40

    框架究竟解决了啥问题?我们可以脱离它们吗?

    使用 Lit 的话,它与构建无关,但如果想对它进行调试,你就必须了解它的模板引擎。这可能是我对这个框架持怀疑态度的最大原因。...在 ReactJS 和 SolidJS 中,我们创建了可以转换为命令式代码的声明式代码,在 DOM 中添加或删除这个标签。在 Svelte 中,会直接编译生成这样的代码。...例如,它允许在没有提交按钮的情况下捕获 “Enter” 键,并允许通过 submitter 属性区分多个提交按钮(在后面的例子中我们会看到这个)。 默认情况下,元素与它们所包含的表单相关联。...我怎么知道某些东西是否需要成为一个表单元素?根据经验来看,如果它绑定到模型中的数据,那么它应该是一个表单元素。...当添加任务时,可以通过克隆模板的内容来重复渲染这个表单。 隐藏的 Input 表示没有直接显示的数据,它们可能用于样式和选择。 这个 DOM 是非常简洁的,它的元素中没有分散的类。

    8K30

    利用web work实现多线程异步机制,打造页面单步调试IDE

    页面IDE可以显示每行代码所在的行,单击某一行,在改行前面会出现一个红点表示断点,点击Parsing按钮后,进入单步调试模式,然后每点一次step按钮,页面就会执行一条语句,被执行的语句会以黄色高亮,同时左边还有一个箭头表明当前编译器正在执行该语句...我们先看看js线程在浏览器中的运行模式: ? 每个线程都对应一个消息队列,线程主体不断的从队列中取出消息然后执行消息所要做的操作,如果一个消息处理太久时,就会把整个线程堵塞住。...,使得在控件前面自动添加一个伪元素,该微元素用于显示行号,并且在输入回车后自动增加行号,由于我们在编辑控件中,每次回车时都会构造一个元素将一行的内容夹在里面,于是当该元素产生后,上面添加的css规则自动在该元素前面添加一个用于显示行号的伪元素...,那么最下面代码被调用,它创建一个的控件将改行包裹起来,同时设置它的onClick函数,以便响应鼠标在改行上的单击事件,一旦我们用鼠标在指定行点击时,onClick事件触发,并调用createBreakPoint...主要原因在于主线程无法使用SharedArrayBuffer类,它只能在woker中定义和使用,如果你在主线程代码文件中定义,例如在MonkeyCompilerIDE.js中声明它的话,会出现undefine

    1.8K30
    领券