【问题标题】:Is there a way to hide react-native-maps markers?有没有办法隐藏 react-native-maps 标记?
【发布时间】:2021-05-12 08:56:00
【问题描述】:

我正在开发一个旅游应用程序,其中包含使用我的数据制作的带有标记的地图。 我想添加“过滤”其标记的选项。 用户可以按“Restaurants”、“Hotels”、“Commerces”按钮来仅显示选定的标记。

(用户按下“餐厅”-> 仅显示餐厅标记,这是想法的图片:

这是我的 Axios 请求的代码,没什么大不了的:

import axios from 'axios';

// URL API BASE
const APIURL = 'http://10.22.101.55:5000/api';


// RECUPERATION DES RESTAURANTS
export const getAllRestaurant = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/restaurant`, {
    nom: nom,
    adresse: adresse,
    ville: ville,
    cp: cp,
    telephone: telephone,
    email: email,
    latitude: latitude,
    longitude: longitude
});

// RECUPERATION DES HôTELS
export const getAllHotel = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/hotel`, {
    nom: nom,
    adresse: adresse,
    ville: ville,
    cp: cp,
    telephone: telephone,
    email: email,
    latitude: latitude,
    longitude: longitude
});

// RECUPERATION DES COMMERCES
export const getAllCommerce = (nom, adresse, ville, cp, telephone, email, latitude, longitude ) => axios.get(`${APIURL}/commerce`, {
    nom: nom,
    adresse: adresse,
    ville: ville,
    cp: cp,
    telephone: telephone,
    email: email,
    latitude: latitude,
    longitude: longitude
});

我的页面代码,我确保将不同的类别分开,希望它会更容易:

import React, { useEffect } from 'react';
import { View, StyleSheet, TouchableOpacity, Text} from 'react-native';
import { ScrollView, TextInput } from 'react-native-gesture-handler';
import MapView, { Marker } from 'react-native-maps';
import Ionicons from 'react-native-vector-icons/Ionicons';


// Récupération des données
import {getAllRestaurant, getAllHotel, getAllCommerce} from '../service/Emplacements'

export default function AccueilScreen() {

  // RECUPERATION DES RESTAURANTS
  const [restaurants, setRestaurants] = React.useState([])
  const LesRestaurants = () => [
    getAllRestaurant().then(response => {
      setRestaurants(response.data);
    }).catch(err => console.log(err))
  ]

  // RECUPERATION DES HÔTELS
  const [hotels, setHotels] = React.useState([])
  const LesHotels = () => [
    getAllHotel().then(response => {
      setHotels(response.data);
    }).catch(err => console.log(err))
  ]

  // RECUPERATION DES COMMERCES
  const [commerces, setCommerces] = React.useState([])
  const lesCommerces = () => [
    getAllCommerce().then(response => {
      setCommerces(response.data);
    }).catch(err => console.log(err))
  ]

  // AFFICHAGE DES MARKERS RESTAURANTS
  const afficheRestaurant = restaurants.map((restaurant) => (
    <Marker
      pinColor='#fdca40'
      key={restaurant.id}
      coordinate={{latitude: restaurant.latitude, longitude: restaurant.longitude}}
      title={restaurant.nom}
    />
  )) 

  // AFFICHAGE DES MARKERS HÔTELS
  const afficheHotel = hotels.map((hotel) => (
    <Marker
      pinColor='#2978b5'
      key={hotel.id}
      coordinate={{latitude: hotel.latitude, longitude: hotel.longitude}}
      title={hotel.nom}
    />
  ))

  // AFFICHAGE DES MARKERS COMMERCES
  const afficheCommerce = commerces.map((commerce) => (
    <Marker
      pinColor='#8fd9a8'
      key={commerce.id}
      coordinate={{latitude: commerce.latitude, longitude: commerce.longitude}}
      title={commerce.nom}
    />
  ))

  // FILTRE RESTAURANT
  const onlyRestaurant = () => {
    afficheCommerce = commerces.map((null))
    afficheHotel = hotels.map((null))
  }

  // CHARGEMENT DES EMPLACEMENTS
  useEffect(() => {
    LesRestaurants()
    LesHotels()
    lesCommerces()
  },[])


  return (
    <View style={styles.container}>

      {/* -- MAP ET MARKERS -- */}
      <MapView
        customMapStyle={MapStyle}
        scrollEnabled={false}
        rotateEnabled={false}
        zoomEnabled={false}
        minZoomLevel={0}
        maxZoomLevel={13}
        style={styles.container}
        region={{
          latitude: 49.4826616,
          longitude: 1.7245633,
          latitudeDelta: 0.015,
          longitudeDelta: 0.0121,
        }}
      >
        {afficheRestaurant}

        {afficheHotel}

        {afficheCommerce}

      </MapView>

      {/* -- BARRE RECHERCHE -- */}
      <View style={styles.searchBox}>
        <TextInput
          placeholder='Rechercher un lieu ...'
          placeholderTextColor='#fb3640'
          style={{flex: 1, padding: 0}}
        />
        <Ionicons name='search-outline' size={20}/>
      </View>

      {/* -- FILTRE -- */}
      <ScrollView
        horizontal
        scrollEventThrottle={1}
        showsHorizontalScrollIndicator={false}
        height={50}
        style={styles.scroll}
        contentContainerStyle={{paddingRight: 20}}
      >

        <TouchableOpacity style={styles.itemAll}>
          <Ionicons size={15} name='options-outline'>  Tout</Ionicons>
        </TouchableOpacity>

        <TouchableOpacity style={styles.itemRestaurant} onPress={onlyRestaurant}>
          <Ionicons size={15} name='restaurant-outline'>  Restaurant</Ionicons>
        </TouchableOpacity>

        <TouchableOpacity style={styles.itemHotel}>
          <Ionicons size={15} name='bed-outline'>  Hôtel</Ionicons>
        </TouchableOpacity>

        <TouchableOpacity style={styles.itemCommerce}>
          <Ionicons size={15} name='cart-outline'>  Commerce</Ionicons>
        </TouchableOpacity>

      </ScrollView>

   </View>
  );
}

// STYLE DE LA PAGE
{...}

 // STYLE DE LA CARTE
 {...}

我做了一些测试(const onylRestaurant),但没有什么好处(.map 可以为 null,或只读错误)。

我想知道您是否有任何我可以使用的想法

感谢您的帮助!

不要犹豫,向我询问更多信息,我还是 react-native 的新手,但我会尽力回答你

【问题讨论】:

    标签: javascript arrays react-native react-native-maps


    【解决方案1】:

    你在正确的道路上。

    在你的组件中有另一个状态变量。

    const [currentCategory, setCurrentCategory] = React.useState('All');

    当用户点击任何按钮时,用相应的类别更新这个变量。

    然后使用这个新的状态变量来决定要显示哪些标记。像这样的。

    const getMarkers = () => {
        switch (currentCategory) {
            case 'hotel': return afficheHotel;
            case 'restaurant': return afficheRestaurant;
            case 'commerce': return afficheCommerce;
            default: return [...afficheHotel, ...afficheRestaurant, ...afficheCommerce];
        }
    }
    

    现在编写一个函数来通过处理 onClick 来更新这个状态变量

    const onCategoryClick = category => {
        setCurrentCategory(category);
    }
    

    现在像这样在你的代码中使用上面的函数

    <TouchableOpacity style={styles.itemAll} onPress={() => onCategoryClick('All')}>
          <Ionicons size={15} name='options-outline'>  Tout</Ionicons>
    </TouchableOpacity>
    
    <TouchableOpacity style={styles.itemRestaurant} onPress={() => onCategoryClick('restaurant')}>
          <Ionicons size={15} name='restaurant-outline'>  Restaurant</Ionicons>
    </TouchableOpacity>
    
    <TouchableOpacity style={styles.itemHotel} onPress={() => onCategoryClick('hotel')}>
          <Ionicons size={15} name='bed-outline'>  Hôtel</Ionicons>
    </TouchableOpacity>
    
    <TouchableOpacity style={styles.itemCommerce} onPress={() => onCategoryClick('commerce')}>
          <Ionicons size={15} name='cart-outline'>  Commerce</Ionicons>
    </TouchableOpacity>
    

    最后,您必须更新代码以删除 MapView 中的此部分

    {afficheRestaurant}
    
    {afficheHotel}
    
    {afficheCommerce}
    

    并在其位置添加此

    {getMarkers()}
    

    所以你的 Mapview 将是这个,

    <MapView
        customMapStyle={MapStyle}
        scrollEnabled={false}
        rotateEnabled={false}
        zoomEnabled={false}
        minZoomLevel={0}
        maxZoomLevel={13}
        style={styles.container}
        region={{
          latitude: 49.4826616,
          longitude: 1.7245633,
          latitudeDelta: 0.015,
          longitudeDelta: 0.0121,
        }}
      >
        {getMarkers()}
    </MapView>
    

    这行得通吗?

    【讨论】:

    • 首先感谢您的回答,不幸的是它似乎不起作用,您能否对您的回答进行一些澄清?也许是我做错了。
    • @QuentinBlanche 您可以在问题中更新您的新代码。我可以检查一下。
    • 是的,问题是我,我在 onPress = onPress={() => setCurrentCategory('restaurant'), getMarkers} 上做的当然 currentCategory 仍然是 'All'
    • 确实是一个新手问题,但是如何在我的 onPress 操作中更改 currentCategory 的状态?这是我唯一的问题,因为如果我直接在组件“GetMarkers”中默认设置 currentCategory,它就可以正常工作。
    • @QuentinBlanche 我已更新答案以包含您必须更改的大部分代码。看看吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多