【问题标题】:Plotting markers on a map using react-native-maps使用 react-native-maps 在地图上绘制标记
【发布时间】:2019-02-04 02:16:01
【问题描述】:

简而言之,我正在尝试使用 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()。但我不知道怎么去那里。

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

【问题讨论】:

  • 这段代码是你的 redux 操作吗?你在用redux吗?你在使用 redux-thunk 吗?
  • 是的。是的。是的。对不起,我忘了提。

标签: javascript react-native react-redux redux-thunk react-native-maps


【解决方案1】:

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

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,以便能够使用检索到的数据。

更新

你的减速器应该是这样的:

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 exampleconnect docs

【讨论】:

  • 啊。真的。作为异步操作更有意义。当您说“在您的减速器的“FETCHING_PLACES_FULFILLED”案例中使用 action.payload”时,您能否详细说明一下?我不太明白那部分。
  • 那么你需要一个 reducer 来使用 redux。看看this。我将在我的答案中添加一个示例
  • 抱歉回复晚了。是的,关于减速器的@Taxelool 是对的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多