SVG (с использованием React Simple Maps) не отображается на мобильных устройствах

#javascript #reactjs #react-native #svg #maps

#javascript #reactjs #react-native #svg #Карты

Вопрос:

Здравствуйте (впервые публикуюсь на Stack Overflow, поэтому приношу извинения за любые нарушения этикета …)

В настоящее время я создаю приложение React, которое содержит интерактивную SVG-карту, созданную с использованием React Simple Maps. В моем настольном браузере все работает так, как ожидалось, однако сама карта не загружается на мобильные устройства (я протестировал несколько), и я не могу понять, почему. Я включил код из рассматриваемого компонента ниже (я удалил некоторые нерелевантные части кода):

 import React, { memo, Component } from 'react';
import { ZoomableGroup, ComposableMap, Geographies, Geography } from "react-simple-maps";
import geoUrl from "../data/topo.json";
import Country from './Country'
import { CSSTransition, SwitchTransition } from "react-transition-group";

class Map extends Component { 

    constructor(props){
        super(props);

        this.state = {
            country: "",
            dish: "",
            description: "",
            photo: "",
            recipe: "",
            selected: false,
        }

        this.handleBack = this.handleBack.bind(this);
        this.handleAbout = this.handleAbout.bind(this);
        this.handleList = this.handleList.bind(this);
    }

    handleEnter(country, dish, description, photo, recipe){
        this.setState({
            country: country,
            dish: dish,
            description: description,
            photo: photo,
            recipe: recipe
        })
    }
    
    render(){ 
    
        const { country, dish, description, photo, recipe, selected } = this.state;
        const countries = geoUrl.objects.ne_50m_admin_0_countries.geometries;

        return(
            <SwitchTransition>
                <CSSTransition
                    classNames="transition"
                    transitionAppearTimeout={50000}
                    key={ selected }
                    in={ selected }
                    unmountOnExit
                    appear
                >         
                    <> 
                        <section className="map">
                            <div className="container">
                                <ComposableMap width="1200" data-tip="" projectionConfig={{ scale: 200 }} >
                                    <ZoomableGroup>
                                        <Geographies geography={geoUrl}>
                                            {({ geographies }) =>
                                                geographies.map(geo =>
                                                    <a href="#country">
                                                        <Geography 
                                                            key={geo.rsmKey} 
                                                            geography={geo}
                                                            onMouseEnter={() => {
                                                                const { NAME } = geo.properties;
                                                                this.props.setTooltipContent(`${NAME}`);
                                                            }}
                                                            onMouseLeave={() => {
                                                                this.props.setTooltipContent("");
                                                            }}
                                                            onClick={() => {
                                                                const { NAME, DISH, DESCRIPTION, PHOTO, RECIPE } = geo.properties;
                                                                this.handleEnter(NAME, DISH, DESCRIPTION, PHOTO, RECIPE);
                                                            }}
                                                            fill="#44BBA4"
                                                            stroke="#E94F37"
                                                            strokeWidth="0.5"
                                                            style={{
                                                                default: {
                                                                    outline: 'none'
                                                                },
                                                                hover: {
                                                                    fill: "#E94F37",
                                                                    outline: 'none'
                                                                },
                                                                pressed: {
                                                                    outline: 'none'
                                                                }
                                                            }}
                                                        />
                                                    </a>
                                                )
                                            }
                                        </Geographies>
                                    </ZoomableGroup>
                                </ComposableMap>
                            </div>
                        </section>
                    </>
                </CSSTransition>
            </SwitchTransition>
        );
    }
}

export default memo(Map);
  

Если у кого-нибудь могут быть какие-либо идеи, это было бы фантастически! Пожалуйста, дайте мне знать, если вы хотите увидеть больше кода / скриншотов и т.д. Спасибо!

Комментарии:

1. Привет, попробуйте изменить ширину с <ComposableMap width=»1200″ на <ComposableMap style={{ width: «100%» }}>

2. @Maitham спасибо! Если я удалил свойство width=»1200″ и заменил его на style={{width: «100%»}}, карта вообще не отображалась ни на мобильном, ни на рабочем столе, однако наличие ОБОИХ свойств в ComposableMap, похоже, устранило проблему. Спасибо!

3. это странные две ширины!! в любом случае, добро пожаловать и удачи

Ответ №1:

Спасибо @Maitham за помощь в уточнении ответа — добавив свойство style={{width: "100%"}} to <ComposableMap> , проблема теперь, похоже, решена! Это НЕ ДОЛЖНО заменять width="1200" свойство (если вы удалите его, карта вообще не будет отображаться на мобильных устройствах или на рабочем столе), но должно быть дополнением к нему:

 <ComposableMap width="1200" style={{ width: "100%" }} data-tip="" projectionConfig={{ scale: 200 }} >