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

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

在Reactjs中添加addEventListener()可以实现在模型之外单击时,模型接近的效果。具体步骤如下:

  1. 首先,在React组件的构造函数中,初始化一个状态变量,用于表示模型是否接近。例如,可以定义一个名为isModelClose的状态变量,并将其初始值设置为false
  2. 在组件的componentDidMount()生命周期方法中,使用addEventListener()方法监听整个文档的点击事件。当点击事件发生时,触发一个回调函数。
  3. 在回调函数中,判断点击事件的目标元素是否在模型的范围内。可以通过获取模型元素的引用(使用ref属性)并结合event.target属性来进行判断。如果点击事件的目标元素在模型范围内,则将isModelClose状态变量设置为true,表示模型接近;否则,将其设置为false,表示模型远离。
  4. 在组件的render()方法中,根据isModelClose状态变量的值来决定模型的样式或位置。可以使用条件渲染或动态样式来实现这一效果。

以下是一个示例代码:

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

class ModelComponent extends Component {
  constructor(props) {
    super(props);
    this.modelRef = React.createRef();
    this.state = {
      isModelClose: false
    };
  }

  componentDidMount() {
    document.addEventListener('click', this.handleClickOutside);
  }

  componentWillUnmount() {
    document.removeEventListener('click', this.handleClickOutside);
  }

  handleClickOutside = (event) => {
    if (this.modelRef.current && !this.modelRef.current.contains(event.target)) {
      this.setState({ isModelClose: true });
    } else {
      this.setState({ isModelClose: false });
    }
  }

  render() {
    const { isModelClose } = this.state;
    const modelStyle = isModelClose ? { /* 模型接近的样式 */ } : { /* 模型远离的样式 */ };

    return (
      <div ref={this.modelRef} style={modelStyle}>
        {/* 模型内容 */}
      </div>
    );
  }
}

在上述示例代码中,模型元素被赋予了一个ref属性,通过this.modelRef.current可以获取到模型元素的引用。在点击事件的回调函数中,使用contains()方法判断点击事件的目标元素是否在模型元素内部。

请注意,上述示例代码中的模型样式和位置的设置需要根据具体需求进行调整。此外,还可以根据实际情况添加其他的事件监听和处理逻辑,以实现更复杂的交互效果。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供灵活可扩展的云服务器实例,适用于各类应用场景。详细信息请参考腾讯云云服务器
  • 腾讯云云原生容器服务(TKE):提供高度可扩展的容器化应用管理平台,支持快速部署和管理容器化应用。详细信息请参考腾讯云云原生容器服务
  • 腾讯云人工智能(AI):提供丰富的人工智能服务和解决方案,包括图像识别、语音识别、自然语言处理等。详细信息请参考腾讯云人工智能
  • 腾讯云物联网(IoT):提供全面的物联网解决方案,包括设备接入、数据管理、应用开发等。详细信息请参考腾讯云物联网
  • 腾讯云区块链(BCBaaS):提供安全可信的区块链服务,支持快速搭建和管理区块链网络。详细信息请参考腾讯云区块链
  • 腾讯云对象存储(COS):提供高可靠、低成本的云端存储服务,适用于各类数据存储需求。详细信息请参考腾讯云对象存储
  • 腾讯云音视频处理(VOD):提供强大的音视频处理能力,包括转码、截图、水印等功能。详细信息请参考腾讯云音视频处理
  • 腾讯云网络安全(SSL):提供全面的网络安全解决方案,包括SSL证书、DDoS防护等。详细信息请参考腾讯云网络安全
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用纯 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个呢,那只能说呵呵了,如果用事件委托,那么我们就可以只对的父级

70810
  • 怎么创建 JavaScript 自定义事件

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

    1.3K10

    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写一个简单的MVC App

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

    2K10

    JavaScript小技能:事件

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

    1.4K10

    Web 框架的替代方案

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

    2.6K10

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

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

    1.2K41

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

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

    2.4K20

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

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

    1.3K50

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

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

    1.6K30

    JS事件流

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

    5.8K10

    web前端常见面试题

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

    2.3K20

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

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

    86820

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

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

    7.9K30

    常见的三个 JS 面试题

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

    1.2K20

    把 React 作为 UI 运行时来使用

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

    2.5K40

    Javascript - 事件顺序

    W3C模型 W3C明智地争论中保持了中立。任何发生在W3C事件模型的事件首先会被捕获,直到到达目标元素才会冒泡。...这可以通过在先进模型那篇有相应解释的addEventListener()方法实现。如果的最后一个参数是true,事件句柄会为捕获阶段而设置,如果是false,事件句柄会为冒泡阶段而设置。...除此之外如果你的文档结构很复杂(有很多嵌套表格之类),你可以通过关闭冒泡来节省系统资源。浏览器必须查看事件目标的每一个祖先元素是否存在事件句柄。即使什么都没发现,搜索仍然会耗费不少时间。...你可以使用this关键字,例子指向事件绑定的那个HTML元素,就像currentTarget。 微软模型的问题 但当你使用微软事件注册模型时this关键字没有指向HTML元素。...这是微软事件注册模型最严重的问题,也是从不使用它的原因,哪怕是IE/WIN才有的应用也不使用。 希望微软可以尽快地添加一个类似currentTarget的属性—或者干脆遵从标准?

    1K50

    科学瞎想系列之四十七 时空穿越

    X轴和Y轴,那么就可以把石子入水这件事所形成的影响用一个圆锥模型来描述,圆锥的顶点坐标就是时间t=0和空间为入水点的位置坐标,这个圆锥是以波纹水中的传播速度形成的扩散效应的物理模型。...如果我们光锥之外,就不会受这个事件的影响,只有光锥之内,事件才影响到我们。...前面说了,要想看到某一事件的过去,你必须要在这个事件的光锥之外,而要想在这个事件的光锥之外,要么你离这个事件的发生地很远,要么你就得比光跑得还要快,跑到光锥之上。...=mc^2看,其实能量和质量是等价的,物体由于运动所得到的能量应该加到的质量上面,速度越接近光速,质量就会增加越快,越接近无穷大进而所需能量也是无穷大,就不能再加速了,这个假说已被许多加速到接近光速的粒子的实验所证实...关于这个思想,老师少儿时期就曾有过,那时老师就坚信,天上还有个,地下也有个这个中间,现在干嘛,天上和地下的干嘛,只不过我们不可能彼此见面,这不就是存在多个平行的世界吗?

    95460
    领券