Я создаю приложение реагирования карт Google, в котором я могу создавать, редактировать и удалять объекты с карты.Когда я нажимаю на маркер, слушатель щелчка карты Google отображает свои данные в форме, где я могу их редактировать.Если я начинаю редактировать данные в моей форме, я устанавливаю состояние «isEditingMapObject» слишком истинным.Это делается с помощью useContext.
Теперь моя цель состоит в том, чтобы запретить другим слушателям щелчка запускать свой код, когда состояние «isEditingMapObject» имеет значение true.Я подумал, что это будет легко с проверкой if.Но, похоже, состояние прослушивателя щелчков «isEditingMapObject» никогда не меняется.Он всегда будет оставаться ложным.
const Markers = ({ googleMap, map }) => {
const mapContext = useContext(MapContext);
const mapMarkerReducer = (state, action) => {
switch (action.type) {
case "ADD":
return state.concat(action.payload.marker);
case "UPDATE":
return state.filter(marker => marker._id !== action.payload._id).concat(action.payload.marker);
case "SET":
return action.payload;
case "REMOVE":
return state.filter(marker => marker._id !== action.payload._id);
default:
return state;
}
}
const [markers, markersDispatch] = useReducer(mapMarkerReducer, []);
useEffect(() => {
if (!googleMap || !map) {
return;
}
axios
.get(constants.API_MARKERS)
.then(result => {
console.log("success");
const markersLoaded = [];
for (const marker of result.data) {
const iconPath = marker.type == "info" ? iconImportant : iconMailbox;
const markerObj = new googleMap.maps.Marker({
zIndex: 115,
position: { lat: marker.latitude, lng: marker.longitude },
icon: {
url: iconPath,
scaledSize: new googleMap.maps.Size(15, 15)
},
type: "marker",
marker: marker,
map: map,
visible: mapContext.markersIsVisible
});
googleMap.maps.event.addListener(markerObj, "click", (marker) => {
if(mapContext.isEditingMapObject) {
return;
}
mapContext.setActiveMapObjectHandler(marker);
});
markersLoaded.push(markerObj)
}
markersDispatch({ type: "SET", payload: markersLoaded });
})
.catch(error => {
console.log(error.response);
});
}, [googleMap, map]);
return null
};
export default Markers;
Я ожидал, что оператор if вызовет возврат, когда состояние mapContext.isEditingMapObject имеет значение true.Но это всегда ложно внутри слушателя.При регистрации состояния вне слушателя mapContext.isEditingMapObject показывает правильное значение.