Search code examples
javascriptreactjsgeolocationleafletreact-leaflet

Leaflet ReactJS Map does not show tile completely


I'm trying to create a map that is inside of a modal. But the map is only showed partially. I've tried invalidatingSize() after node is created but it doesn't seem to work.

import React from 'react';
import ReactDOM from 'react-dom'
import L from 'leaflet';

class Mapa extends React.Component {
    constructor(props){
        super(props);
        this.state = {
        };
    }

    createMap(element){
        var map = L.map(element);
        L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
            attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
        }).addTo(map);
        return map;
    }

    setupMap(){
        this.map.setView([this.props.lat, this.props.lon], this.props.zoom);
        this.map.invalidateSize();
    }

    componentDidMount(){
        let self = this;
        if (this.props.createMap) {
            this.map = this.props.createMap(ReactDOM.findDOMNode(self));
        } else {
            this.map = this.createMap(ReactDOM.findDOMNode(self));
        }

        this.setupMap();
    }

    render(){
        /*Returns div with id map*/
    }
}

Solution

  • Finally I fixed. The code is correct but I didn't add leaflet dependencies correctly. Once I fixed that all worked perfectly. In fact this.map.invalidateSize(); was no necessary.

        import React from 'react';
        import ReactDOM from 'react-dom'
        import L from 'leaflet';
    
        class Mapa extends React.Component {
            constructor(props){
                super(props);
                this.state = {
                };
            }
    
            createMap(element){
                var map = L.map(element);
                L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
                    attribution: '© OpenStreetMap contributors'
                }).addTo(map);
                return map;
            }
    
            setupMap(){
                this.map.setView([this.props.lat, this.props.lon], this.props.zoom);
            }
    
            componentDidMount(){
                let self = this;
                if (this.props.createMap) {
                    this.map = this.props.createMap(ReactDOM.findDOMNode(self));
                } else {
                    this.map = this.createMap(ReactDOM.findDOMNode(self));
                }
    
                this.setupMap();
            }
    
            render(){
                /*Returns div with id map*/
            }
        }