注册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 函数越来越多。
112021-10-13
相似问题