我正在使用react-native-maps
显示我所在地区的火车站标记。每个标记都有一个Callout,其中包含接近列车的真实的数据。
问题是;我在Map上的每一个标记的每一个标注都在背景中渲染。此外,每个标注正在重新渲染,因为我有来自真实的API的新数据。这导致数百个视图被渲染,即使我只需要按下的标记的标注。app screenshot
是否有一种方法可以确保在用户按下特定标记之前不会呈现标注?后按;我还想确保只渲染和显示特定标记的标注。
我的代码:
Map屏幕:
const MapScreen = props => {
// get user location from Redux store
// this is used to center the map
const { latitude, longitude } = useSelector(state => state.location.coords)
// The MapView and Markers are static
// We only need to update Marker callouts after fetching data
return(
<SafeAreaView style={{flex: 1}}>
<MapView
style={{flex: 1}}
initialRegion={{
latitude: parseFloat(latitude) || 37.792874,
longitude: parseFloat(longitude) || -122.39703,
latitudeDelta: 0.06,
longitudeDelta: 0.06
}}
provider={"google"}
>
<Markers />
</MapView>
</SafeAreaView>
)
}
export default MapScreen
标记组件:
const Markers = props => {
const stationData = useSelector(state => state.stationData)
return stationData.map((station, index) => {
return (
<MapView.Marker
key={index}
coordinate={{
// receives station latitude and longitude from stationDetails.js
latitude: parseFloat(stationDetails[station.abbr].gtfs_latitude),
longitude: parseFloat(stationDetails[station.abbr].gtfs_longitude)
}}
image={stationLogo}
zIndex={100}
tracksInfoWindowChanges={true}
>
<MapView.Callout
key={index}
tooltip={true}
style={{ backgroundColor: "#ffffff" }}
>
<View style={styles.calloutHeader}>
<Text style={{ fontWeight: "bold" }}>{station.name}</Text>
</View>
<View style={styles.calloutContent}>
<StationCallout key={index} station={stationData[index]} />
</View>
</MapView.Callout>
</MapView.Marker>
);
});
};
StationCallout组件:
const StationCallout = (props) => {
return(
props.station.etd.map((route, index) => {
const approachingTrains = function() {
trainText = `${route.destination} in`;
route.estimate.map((train, index) => {
if (index === 0) {
if (train.minutes === "Leaving") {
trainText += ` 0`;
} else {
trainText += ` ${train.minutes}`;
}
} else {
if (train.minutes === "Leaving") {
trainText += `, 0`;
} else {
trainText += `, ${train.minutes}`;
}
}
});
trainText += " mins";
return <Text>{trainText}</Text>;
};
return <View key={index}>
{approachingTrains()}
</View>;
})
)
};
export default StationCallout
3条答案
按热度按时间unftdfkk1#
在ComponentDidMount上,您应该获取所有列车的数据,以便可以在其位置上设置所有标记。你可以使用once('value')事件来完成这个任务,这个事件只在调用的时候从引用中获取数据一次,所以你可以在组件挂载的时候调用它。
阅读更多关于ONCE('VALUE')
现在,你有他们的位置上的所有指针,用户可以点击任何一个指针跟踪它的运动权利?
因此,每个指针必须有一些独特的东西,如火车ID或我不知道你的数据库结构的东西,所以我假设你有火车ID,现在在onPress函数的标记,你应该传递这个TrainID。
举例说明:
现在在
TrackSpecificTrain
函数中,你应该用火车ID和firebase on('value')事件调用你的数据库引用,现在你将继续获得所选火车的真实的数据,你可以用来自firebase的新数据更新你的本地状态stationData
。例如
现在,我们还使用
RemoveTracker
,因为如果用户单击另一个标记,您可能需要停止跟踪前一列火车,因此它将开始跟踪新标记上的trainID并停止跟踪前一列火车!.mi7gmzs62#
其实我自己找到了答案。我创建了对每个标记的引用,然后将onPress属性传递给其Callout组件,<MapView.Marker>并将showCallout属性传递给其Callout组件。
标记组件:
Callout组件仅在showCallOut为true时获取数据。标注组件中
因此,除非单击标记,否则本地状态将保持为null,callouts不会获取任何数据。
当您点击索引0处的标记时:
wwtsj6pe3#
在MapView中使用标记,标注像这样。当用户单击其他标记(然后出现新标记视图)或Map本身时,此标注视图将消失。