注册click事件回调时,若使用匿名函数做回调,问题:多次单击后再单次单击会多次调用回调

来源:3-5 useEffect 需要清除的 Effect

weixin_慕前端9168190

2021-08-06

MouseTracker.js文件如下:

import React, { useEffect, useState} from 'react'

const MouseTracker = () => {
    const [position, setposition] = useState({x: 0, y: 0})

    useEffect(() => {
        const updatePosition = (event) =>{
            console.log('inner')
            setposition({x: event.x, y:event.y})
        }

        console.log('add listener')
        document.addEventListener('click', (event) => {updatePosition(event)})

        return (() => {
            console.log('delete listener')
            document.removeEventListener('click', updatePosition)
        })
    })
    
    return (
        <span>x: {position.x}, y: {position.y}</span>
    )
}

export default MouseTracker

package.json文件:

{
  "name": "my-project",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.14.1",
    "@testing-library/react": "^11.2.7",
    "@testing-library/user-event": "^12.8.3",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-scripts": "4.0.3",
    "web-vitals": "^1.1.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

若把

document.addEventListener('click', (event) => {updatePosition(event)})

改为

document.addEventListener('click', updatePosition)

就不会出现

写回答

1回答

张轩

2021-08-07

同学你好 因为第一种匿名函数 等于每次重新创建了一个函数,在清理的时候并没有清理掉创建的函数(而只清理了回调中的函数),

(event) => {updatePosition(event)}) 不等于 updatePosition

这样就会造成绑定在 docuemnt 上面的 click 函数越来越多。

1
1
weixin_慕前端9168190
好的,谢谢老师
2021-10-13
共1条回复

2024更新 Electron+React+七牛云实战跨平台桌面应用

开发一款自动云同步的 Markdown 文件管理软件

1269 学习 · 466 问题

查看课程