Состояние ответа не обновляется в слушателях Google Maps - PullRequest
0 голосов
/ 31 мая 2019

Я создаю приложение реагирования карт 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 показывает правильное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...