使用 react-native-maps 在地图上绘制标记

Plotting markers on a map using react-native-maps

简而言之,我正在尝试使用 react-native-maps 在地图上绘制标记。

我已经创建了一个操作来从服务器获取坐标和相应的 ID(请参见下面的代码)。

export const getPlacesOnMap = () => {
return dispatch => {
    dispatch(authGetToken())
        .then(token => {
            return fetch("myApp?auth=" + token);
        })
        .catch(() => {
            alert("No valid token found!");
        })
        .then(res => {
            if (res.ok) {
                return res.json();
            } else {
                throw(new Error());
            }
        })
        .then(parsedRes => {
            const places = [];
            for (let key in parsedRes) {
                places.push({
                    // ...parsedRes[key], // this fetches all the data
                    latitude: parsedRes[key].location.latitude,
                    longitude: parsedRes[key].location.longitude,
                    id: key
                  });
                } console.log(places)
                dispatch(mapPlaces(places));
              })
        .catch(err => {
            alert("Oops! Something went wrong, sorry! :/");
            console.log(err);
        });
    };
};


export const mapPlaces = places => {
return {
    type: MAP_PLACES,
    places: places
 };
};

我不知道我是否使用了正确的词,但我基本上已经使用 componentWillMount() 测试了代码(上面),它成功地将多个坐标作为对象数组返回。

现在,问题是我不知道下一步该做什么。据我所知,我知道最终目标是创建一个 setState()。但是我不知道怎么去。

如果有人能指出我正确的方向,那将是一个很大的帮助。

您需要创建一个异步操作。您可以根据其中的异步函数是已解析还是已拒绝,在异步操作中分派不同的操作。

export function getPlacesOnMap(token) {
    return async function(dispatch) {
        dispatch({
            type: "FETCHING_PLACES_PENDING"
        });
        fetch("myApp?auth=" + token)
        .then(res => {
            dispatch({
                type: "FETCHING_PLACES_FULFILLED",
                payload: res.json()
            });
        })
        .catch(error => {
            dispatch({
                type: "FETCHING_PLACES_REJECTED",
                payload: error
            });
        });
    };
}

如果您的 authGetToken() 函数也是一个 promise,您需要在 authGetToken() 解析后调度此操作。 您可以在减速器的 "FETCHING_PLACES_FULFILLED" 案例中使用 action.payload 以便能够使用检索到的数据。

更新

你的reducer应该是这样的:

export default function reducer(
    state = {
        loadingMarkers : false,
        markers : [],
        error : null,
    },
    action
) {
    switch (action.type) {
        case "FETCHING_PLACES_PENDING":
            return { ...state, loadingMarkers: true };
        case "FETCHING_PLACES_FULFILLED":
            return { ...state, loadingMarkers: false, markers: action.payload};
        case "FETCHING_PLACES_REJECTED":
            return { ...state, loadingMarkers: false, error: action.payload };
        default:
            return state;
    }
}

现在您可以将您的组件连接到 redux 并在获取它们时使用您的标记。

看看this example and connect docs