react-map-gl-geocoder icon indicating copy to clipboard operation
react-map-gl-geocoder copied to clipboard

Search field is reader multi time on map when reuseMaps=true

Open matinfo opened this issue 6 years ago • 6 comments

I implemented like in your example. Search field working well. But if I switch to an other page or when local dev server is reloaded on files change, the search field is not destroyed and an other appears.

How to fix that? Screenshot 2019-09-04 at 09 43 44

matinfo avatar Sep 04 '19 07:09 matinfo

Hi @matinfo, what version are you using? Are there any errors in the dev console when this happens?

SamSamskies avatar Sep 04 '19 16:09 SamSamskies

@SamSamskies the version used are: "mapbox-gl": "^1.3.0", "react": "^16.9.0", "react-dom": "^16.9.0", "react-map-gl": "^5.0.10", "react-map-gl-geocoder": "^2.0.11", "react-router-dom": "^5.0.1", "viewport-mercator-project": "^6.2.0",

and not error in the console.

My render look like this:

render() {
    const { viewport, settings, mapMarkers } = this.state;

    return (
      <MapGL
        {...viewport}
        {...settings}
        width="100%"
        height="100%"
        mapStyle="mapbox://styles/XXXXXXXXX/cjy4nlft63s0w1bqlto3pfar0"
        mapboxApiAccessToken={MAPBOX_TOKEN}
        onViewportChange={(viewport, interaction) => this._onViewportChange(viewport, interaction)}
        reuseMaps={true}
        ref={this.mapRef}
      >
        {mapMarkers.map(this._renderMarker)}
        {this._renderPopup()}

        <div className="fullscreen" style={fullscreenControlStyle}>
          <FullscreenControl />
        </div>
        <div className="nav" style={navStyle}>
          <NavigationControl
            showCompass={false}
            onViewportChange={(viewport, interaction) => this._onViewportChange(viewport, interaction)}
          />
        </div>
        <Geocoder
          mapRef={this.mapRef}
          onViewportChange={this._handleGeocoderViewportChange}
          mapboxApiAccessToken={MAPBOX_TOKEN}
          position="top-left"
          trackProximity={true}
          clearAndBlurOnEsc={true}
          placeholder="Search location"
          countries="ch"
        />
      </MapGL>
    );

I found the cause of the issue, if I change to reuseMaps={false} the search field are not duplicated!

matinfo avatar Sep 05 '19 06:09 matinfo

Thanks for the info. I've never used the reuseMaps prop before. I'll need to look into that.

SamSamskies avatar Sep 06 '19 01:09 SamSamskies

I wrap my ReactMapGl with Deck.gl, I use the suggestion to use reuseMap but still rendered minima three times,

and after the viewport changed, it become so many search field

mohridwanhdp avatar Sep 15 '20 03:09 mohridwanhdp

Hi @mohridwanhdp, could you provide an example in Code Sandbox that demonstrates your issue?

SamSamskies avatar Sep 15 '20 04:09 SamSamskies

Hi @mohridwanhdp, could you provide an example in Code Sandbox that demonstrates your issue?

I'm sorry it's my mistake here cause not use the right ref

Before, I use this in my ReactMapGL <ReactMapGL mapStyle={mapStyle} mapboxApiAccessToken={MAPBOX_TOKEN} preserveDrawingBuffer={true} ref={(reactMap) => (this.reactMap = reactMap)} reuseMaps={false} onLoad={(e) => { this._onMapLoaded(); }} >

Then i change the ref like this : ref={this.reactMap}

And It's become normal

mohridwanhdp avatar Nov 25 '20 04:11 mohridwanhdp