Javascript 事件侦听器中的React hook保存状态错误?

Javascript 事件侦听器中的React hook保存状态错误?,javascript,reactjs,addeventlistener,event-listener,react-hooks,Javascript,Reactjs,Addeventlistener,Event Listener,React Hooks,我有点和更新点的功能: const [points, setPoints] = useState([]) const updatePoint = (updatedPoint) => { setPoints(points.map(point => (point.id === updatedPoint.id ? updatedPoint : point))) } 我已将侦听器添加到标记: window.google.maps.event.addListener(marker, '

我有点和更新点的功能:

const [points, setPoints] = useState([])

const updatePoint = (updatedPoint) => {
  setPoints(points.map(point => (point.id === updatedPoint.id ? updatedPoint : point)))
}
我已将侦听器添加到标记:

window.google.maps.event.addListener(marker, 'dragend',
  function (markerLocal) {
    console.log(getPoints)       
  }
)
如果我在创建第一个标记后单击它,它会在控制台中显示1个点。
如果我创建并单击second,它将显示2个点,因此它将保存侦听器内部的状态。但是,在第二次保存后,第一个标记的点数总和不会改变(当它被拖动时)。这是正确的行为吗?第一个记号笔怎么能得两分?每当我尝试更新我的点列表并单击第一个标记时,它只给我一个点-这是错误的。

这可能是因为处理程序在声明时使用了
点,在调用它之前可能会更新。我对这些问题的解决方案是将其定义为ref:

const points = useRef([]);
// This means that instead of `setPoints` you will do points.current = newValue

const updatePoint = (updatePoint) => {
   points.current = points.current.map(...);
}

如果以前的状态用于计算新状态,如示例中所示,则应直接传递旧状态的函数,而不是新值:

const updatePoint = (updatedPoint) => {
  setPoints((prevPoints) =>
      prevPoints.map(point => (point.id === updatedPoint.id ? updatedPoint : point)
  ))
}

Hooks API参考的相关部分:

尝试添加useEffect和
依赖项,并为谷歌地图设置addEventListener。这里的一个问题是初始addEventListener正在处理的范围。在常规JS中,作用域中始终包含当前值,但是在挂钩中,代码将引用以前呈现的过时值。在您的情况下,您引用的是将事件附加到Google Maps时您的
状态的值。在我看来,这里最干净的解决方案是Leftium的解决方案,但出于“学术”目的,您也可以尝试此解决方案:

const onGoogleMapsMarkerDragend = () => {
    console.log(points);
}
useEffect(() => {
    const dragendListener = window.google.maps.event.addListener(marker, 'dragend', onGoogleMapsMarkerDragend);
    return () => {
        window.google.maps.event.removeListener(dragendListener );
    }
}, [points];

不确定removeListener是否有效-查看文档

我认为您可能需要显示更多代码-什么是
getPoints
?你在哪里设置你的听众?