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
?你在哪里设置你的听众?