React Hooks removeEventListener 使用无效问题

2023-05-16

组件卸载时

和原来的componentWillUnmount一样的用法, 在useEffect return里调用就可以了

 useEffect(() => {
    window.addEventListener('click', clickFunc);
    return () => {
      window.removeEventListener('click', clickFunc);
    };
  });

组件使用过程中

当组件不涉及重新渲染时了, 像这么写完全没问题, 点击Remove Click to Console之后监听取消.

import React, { useState } from "react";

  const App = () => {
    // const [state, setState] = useState(0)

    const handleAddListening = () => {
      window.addEventListener('click', clickFunc)
      // setState(state + 1)
    }

    const clickFunc = () => {
      console.log('clicking')
    }

    const handleRemoveListening = () => {
      window.removeEventListener('click', clickFunc)
    }

    return (
      <div className="App">
        <div onClick={handleAddListening}>
          Click to Console
        </div>
        <div onClick={handleRemoveListening}>
          Remove Click to Console
        </div>
      </div>
  );
}

现在我们把以上代码中的注释取消掉, 加入useState导致组件再次渲染, 此时发现无论如何点击Remove Click to Console, 点击事件发生时, 会一直console clicking.
甚至再次单击Click to Console触发绑定事件, 发现会同时console clicking两次;
再再次单击, console次数会继续累计增加.

这是因为每次触发组件再次渲染, clickFunc作为组件内的方法, 会跟着一同再次渲染, 并且在内存里, 再次渲染出的 clickFunc !== 前clickFunc.
所以removeEventListener无法解除绑定, 再次addEventListener则会绑定一个新方法.

解决方案:

const clickFunc = useCallback(() => {
    console.log("clicking");
  }, []);

使用无依赖的useCallback解决clickFunc的重新渲染问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Hooks removeEventListener 使用无效问题 的相关文章

  • 函数式组件与类组件有何不同?

    与React类组件相比 React函数式组件究竟有何不同 在过去一段时间里 典型的回答是类组件提供了更多的特性 比如state 当有了Hooks后 答案就不再是这样了 或许你曾听过它们中的某一个在性能上的表现优于另一个 那是哪一个 很多此类
  • css in js开发利器 - styled-components(样式组件)

    styled components 是一个常见的 css in js 类库 和所有同类型的类库一样 通过 js 赋能解决了原生 css 所不具备的能力 比如变量 循环 函数等 注意 有时候 React 版本和 styled componen
  • Antd DatePicker 设置默认值报clone.weekday is not a function

    代码 dayjs版本1 11 7 页面 当点击页面日期框会报clone weekday is not a function 解决方法 在jsx文件中添加如下js import dayjs from dayjs import advanced
  • React Native 环境搭建, 新建项目, 运行和调试

    React Native 可以理解为一个基于 JavaScript 具备动态配置能力 面向前端开发者的移动端开发框架 目前为止虽然一直还没有V1 0 0版本 但是相信很多小伙伴都了解过或者已经入坑了 为什么RN那么有人气呢 我们可以先简单分
  • react项目中使用react-dnd实现列表的拖拽排序

    现在有一个新需求就是需要对一个列表 实现拖拽排序的功能 要实现的效果如下图 可以通过 react dnd 或者 react beautiful dnd 两种方式实现 今天先讲下使用react dnd是如何实现的 github地址 https
  • React重新渲染的触发机制及其优化策略

    React是一个用于构建用户界面的JavaScript库 它的核心特点之一是使用虚拟DOM Virtual DOM 来实现高效的组件渲染 那组件重新渲染的机制是如何呢 基于这些机制 如果进行优化呢 虚拟DOM是一个用JavaScript对象
  • 【前端】react-markdown配置解析

    文章目录 react markdown基本配置 同步预览配置 MdEditorComponent js reducer js initBlogState js action types js sync actions js store js
  • styled-components 的用法

    用于给标签或组件添加样式 给标签或组件添加样式 import styled from styled components styled button 给button标签添加样式 const Button styled button back
  • Ant Design Pro 从零到一教程

    说在最前面的话 可是能全网唯一适合小白的antd教程 因为我找了接近一个周的教程 无论是视频 博客等等都没有比较完整的教程 所以才说这可能是唯一全网适合小白教程 文章末有相关学习链接 适用人群 喜欢看文字或者代码学习的人 学习的人掌握基本的
  • 编写一套工具库并上传NPM

    你的 工具箱 开箱即可用的 directive utils 说明 vue3 directive tools 是一个方便在 Vue 3 Ts 项目中快速使用的 directive tool 的 npm 插件 它允许您轻松地在项目中添加多种功能
  • 【react】新旧生命周期对比

    componentWillUpdate componentWillReceiveProps componentWillMount 上述这三个生命周期在V18以上的版本中 使用时要加上UNSELF name
  • react组件状态同步-状态提升

    假设定义组件TemperatureInputSon import React from react class TemperatureInputSon extends React Component constructor props su
  • React官方文档--Lifting State Up

    Lifting State Up 如果 几个组件需要同时影响并且修改同一个数据 我们建议将这个共享状态进行提升 给他们最近的共同祖先 在这个部分 我们将要创建一个温度计算器来判断水会不会在给定温度下沸腾 我们将从一个叫做BoilingVer
  • umi 后台管理demo

    umi 后台管理demo umi react ts dva antd egg 有待优化 简单的前后端管理demo 接口提供增删查改 前端也有相应功能 github代码 https github com huiBuiling ql admin
  • React class组件、react-hook函数组件分别实现五子棋

    react class类组件 react hook函数组件分别实现五子棋 前言 使用create react app脚手架简单搭建 不用安装其他依赖 纯 js css实现 这里就只是简单的说明目录结构和思路 具体的代码实现请转到 Githu
  • React 定时刷新接口

    通过 useEffect 在页面加载时调用 getNodeDetailList 列表接口 useEffect gt getNodeDetailList change 然后通过 setInterval 来进行定时刷新 useEffect gt
  • react 父组件调用子组件的方法

    子组件中 const child forwardRef props ref gt useImperativeHandle ref gt 这里面的方法是暴露给父组件的 test console log 我是组件里的test方法 test2 t
  • hooks实践总结

    何为hooks 在React中hook是指不编写 class 的情况下使用 state 以及其他的 React 特性 而Vue3也推出了具有相同功能的组合式API 如果你用过Vue3就会知道在 setup 中你应该避免使用 this 因为h
  • 值得收藏的UmiJS 教程

    点击上方关注 前端技术江湖 一起学习 天天进步 前言 网上的umi教程是真的少 很多人都只写了一点点 很多水文 所以打算自己写一篇 自己搭建umi 并封装了一下常用的功能 并用到公司实际项目中 umi介绍 Umi 是什么 Umi 中文可发音
  • error Missing “key“ prop for element in array react/jsx-key

    react遇到一个奇怪的问题 error Missing key prop for element in array react jsx key 检查了jsx中使用map的 都定义了key div otherList map item an

随机推荐

  • AttributeError:module ‘distutils‘ has no attribute ‘version

    AttributeError module distutils has no attribute 39 version 在使用torch utils tensorboard时 xff0c 出现错误 xff1a 出错语句from torch
  • CPU、GPU、NPU的区别

    CPU GPU NPU的区别 CPU CPU xff08 CentralProcessing Unit xff09 中央处理器 xff0c 是一块超大规模的集成电路 xff0c 主要逻辑架构包括控制单元Control xff0c 运算单元A
  • jdk(Linux+Windows)环境变量配置

    Windows jdk环境变量配置 xff1a PATH JAVA HOME bin JAVA HOME jre bin CLASSPATH JAVA HOME lib JAVA HOME lib tools jar JAVA HOME l
  • 并发编程-生产者消费者模式Java代码实现

    并发编程 生产者消费者模式Java代码实现 生产者消费者模式 生产者仅负责产生结果数据 xff0c 不关心数据该如何处理 xff0c 而消费者专心处理结果数据 消息队列是有容量限制的 xff0c 满时不会再加入数据 xff0c 空时不会再消
  • Java自定义线程池详解及代码实现(非直接调用ThreadPoolExecutor)

    JJava自定义线程池详解及代码实现 非直接调用ThreadPoolExecutor JDK中的线程池函数ThreadPoolExecutorJDK中的线程池执行任务时的流程自定义线程池业务分析自定义线程池的代码实现 注释详尽1 定义阻塞队
  • BIO、NIO、IO多路复用(select/poll/epoll)、信号驱动IO、异步IO

    BIO NIO IO多路复用 select poll epoll 信号驱动IO 异步IO Linux用户空间和内核空间阻塞IO xff08 Blocking IO xff09 非阻塞IO xff08 Noblocking IO xff09
  • 离散数学对学计算机有什么用?

    离散数学是计算机专业的一门重要基础课 它所研究的对象是离散数量关系和离散结构数学结构模型 由于数字电子计算机是一个离散结构 xff0c 它只能处理离散的或离散化了的数量关系 xff0c 因此 xff0c 无论计算机科学本身 xff0c 还是
  • VistualBox开机后台启动虚拟机

    有时候我们想学习使用其它的系统时 xff0c 总会面临一个问题 xff0c 装系统 装双系统吧 xff0c 总觉得别扭 xff0c 而且反复切换让人头大 使用虚拟机吧 xff01 每一次都得启动虚拟机然后启动虚拟机中的系统 xff0c 体验
  • ubuntu下循环登录的解决方法

    用老师的电脑跑完程序后出现的情况 xff1a ubuntu下每个的账户输入密码后黑屏一闪后回到登录界面 考虑可能的原因是1 xff0c 磁盘满了 xff0c 无法启动2 xff0c 非法关机 进行尝试 xff1a ctrl 43 alt 4
  • Python,批量删除txt文本指定行

    本文解决问题 xff1a 批量删除多行txt文本中的内容 思路 xff1a 1 找出需要删除行的 id xff08 就是需要删除那些行 xff0c 把这是第几行给记录下来 xff09 2 将原文本内容不需要删除的行 赋予到 新的列表 xff
  • PreparedStatement的解释和优势,PreparedStatement和Statement的比较

    PreparedStatement的解释 xff1a PreparedStatement是java sql包下的一个接口 xff0c 用来执行sql语句查询 xff0c 通过调用conn prepareStatement sql 方法可以获
  • linux删除桌面

    关闭开机的时候启动动画 xff1a 在 boot grub grub cfg 中 xff1a 将 rhgb quiet 改为 quiet 如果没有图形化界面 xff0c 可以使用下面的方法开启网络 xff1a cd etc sysconfi
  • Windows 下PowerShell 美化之旅(极其简单)

    查看本地策略 Get ExecutionPolicy List 如果是上图这种策略就不用改了 xff0c 如果不是就需要输入 set executionpolicy remotesigned 简单介绍一下五种策略 1 Restricted
  • nanopi2 启动信息

    Second Boot by Nexell Co Ver0 6 1 Built on Oct 16 2015 13 42 17 EMA VALUE 001 123 Lock value 61 156 GATE CYC 61 0x000084
  • 0805,0603,1206这些封装的名字是什么来的

    封装尺寸是长x宽 xff0c 0805 0603 1206 这些单位是英制 xff0c 0805代表0 8英寸x0 5英寸 xff0c 而1英寸 61 25 4毫米 xff08 注意 xff1a 封装尺寸是实物封装的尺寸 xff0c 不是焊
  • 记一次vue中获取audio媒体总时长duration遇到的问题

    audio获取当前播放时间 在dom挂载完毕后访问currentTime属性获得 xff0c 通过timeupdate钩子可实时监控 audio 获取媒体总时长 在canplay xff08 浏览器可以开始播放该音视频 xff09 钩子函数
  • nuxt window is not defined

    报错如下 nuxt window is not defined解决方案1 在nuxt config js 里面添加ssr false plugins span class token punctuation span span class
  • react 使用@loadable/component 实现路由动态懒加载

    踩坑记录 动态引入import 变量失效问题 xff0c import不能导入变量字符串的路径问题因为webpack的现在的实现方式不能实现完全动态 xff0c 所以可以通过字符串模板来提供部分信息给webpack xff0c 如下 spa
  • 记录nuxt 使用 vue-seamless-scroll 无缝滚动和 v-viewer点击放大图片的组件

    地址 v viewer 点击图片放大vue seamless scroll 无缝滚动 遇到的问题 v viewer 点击图片无法响应事件解决 使用事件委托 GotoImage span class token operator lt spa
  • React Hooks removeEventListener 使用无效问题

    组件卸载时 和原来的componentWillUnmount一样的用法 在useEffect return里调用就可以了 span class token function useEffect span span class token p