You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native fetch多标记点报错:TypeError无法执行this.state.markers.map

Fixing the "undefined is not an object (evaluating 'this.state.markers.map')" Error

Hey there! Let's break down what's causing that error and fix it step by step. That error is telling you that when your code tries to run this.state.markers.map(), this.state.markers is undefined—so let's tackle the root causes and get those map markers rendering properly.

1. First: Initialize Your markers State as an Empty Array

The most common reason for this error is that your component's markers state isn't initialized to an array. When your component first renders, if markers is undefined instead of an empty array, calling .map() on it will throw that TypeError.

Add this to your component's state initialization (either in the constructor or using class fields):

export default class Whereto extends Component {
  constructor(props) {
    super(props);
    this.state = {
      markers: [], // Critical: Initialize as empty array
      // Add any other state properties you need here
    };
  }
  // ... rest of your code
}

2. Properly Handle the Google Places API Promise (and Avoid Unhandled Rejections)

Your unhandled Promise rejection error comes from not catching errors in your API call. Always chain a .catch() block to your fetch call to handle network issues, invalid API keys, or malformed responses.

Here's a cleaned-up example of fetching and processing the Places API data:

fetchNearbyPlaces = () => {
  // Replace with your actual API endpoint (don't forget your API key!)
  const apiUrl = `https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=YOUR_LAT,YOUR_LNG&radius=5000&type=restaurant&key=YOUR_API_KEY`;

  fetch(apiUrl)
    .then(response => {
      if (!response.ok) {
        throw new Error(`HTTP error! Status: ${response.status}`);
      }
      return response.json();
    })
    .then(data => {
      // Double-check the response structure (log it if you're unsure!)
      console.log('Places API response:', data);

      // Extract coordinates and create marker objects
      const newMarkers = data.results.map((place, index) => ({
        key: index.toString(), // Always add a unique key for list items
        coordinate: {
          latitude: place.geometry.location.lat,
          longitude: place.geometry.location.lng
        },
        title: place.name,
        description: place.vicinity
      }));

      // Update state with the new markers
      this.setState({ markers: newMarkers });
    })
    .catch(error => {
      console.error('Failed to fetch nearby places:', error);
      // Optional: Show an error message to the user here
    });
};

3. Call the API When the Component Mounts

Make sure you trigger the API call when your component first loads—use componentDidMount() for class components:

componentDidMount() {
  this.fetchNearbyPlaces();
}

4. Safely Render Markers in MapView

Even with an initialized empty array, it's a good practice to add a quick check before mapping (to handle edge cases where state might be unexpectedly reset):

render() {
  return (
    <MapView style={{ flex: 1 }}>
      {/* Only map if markers exists and is an array */}
      {this.state.markers?.map(marker => (
        <MapView.Marker
          key={marker.key}
          coordinate={marker.coordinate}
          title={marker.title}
          description={marker.description}
        />
      ))}
    </MapView>
  );
}

Note: The ?. optional chaining operator safely skips the map call if markers is undefined or null. If you're targeting older environments, you can use this.state.markers && this.state.markers.map(...) instead.

Quick Troubleshooting Tips

  • Double-check your Google Places API key is valid and has the "Places API" enabled in the Google Cloud Console.
  • Log the API response (console.log(data)) to confirm data.results is an array of places with geometry.location.lat and geometry.location.lng properties.
  • Make sure you're not accidentally overwriting this.state.markers with undefined somewhere else in your code.

内容的提问来源于stack exchange,提问作者johnobc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:22:49