Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

170
Visualizações
Cannot destructure property 'MapContainer' of 'reactLeaflet' as it is null

I have a React functional component that has a react-leaflet map being rendered on the server-side. The map shows perfectly, but when I add a click event handler function to pass to the parent component I am greeted with the error: Cannot destructure property 'MapContainer' of 'reactLeaflet' as it is null This is code in the child component:

const MyMap = (props, ref) => {
    
    const [ reactLeaflet, setReactLeaflet ] = useState(null);
    const [ position, setPosition ] = useState(null);
    useEffect(() => {
        const loadData = async () => {
            // react-leaflet errors if imported server-side (with "ReferenceError: window is not defined")
            // not sure if this load can happen in parallel with leaflet.js or not
            import('react-leaflet')
                .then(leaflet => setReactLeaflet(leaflet))
                .catch(error => noticeError(null, levels.error, error, "react-leaflet failed to load"));
        };

        loadData();
    }, []);


    const {
        MapContainer,
        Marker,
        Popup,
        TileLayer,
        useMapEvents,
    } = reactLeaflet;

    const HandleClickMap = (e) =>{

        const currMap = useMapEvents({ 
            click() {
                currMap.locate();
            },
            locationfound(e) {
                setPosition(e.latlng);
                currMap.flyTo(e.latlng, currMap.getZoom());
            },
        });

        return position === null ? null : ( <Marker position={position}></Marker> );
        
    };

    useImperativeHandle(ref, () => ({
        HandleClickMap,
    }));



    if (!reactLeaflet) {
        return <LeafletCss />;
    }


    return <>
        <LeafletCss />
        <MapContainer
            center={{ lat: 0, lng: 0 }}
            zoom={13}
            ref={ref}
            scrollWheelZoom={false}
            className={style.mapContainer}
        >
            <TileLayer
                attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
                url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
            />
            <HandleClickMap />
        </MapContainer>
    </>;
};

export default forwardRef(MyMap);

This problem happened when I added in the useImperativeHandle hook. Any insight into why is appreciated.

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Check if reactLeaflet object has been imported before attempting to access its components

const MyMap = (props) => {
   const {
        MapContainer,
        Marker,
        Popup,
        TileLayer,
        useMapEvents,
    } = props.reactLeaflet;

    const [ position, setPosition ] = useState(null);

    const HandleClickMap = (e) =>{

        const currMap = useMapEvents({ 
            click() {
                currMap.locate();
            },
            locationfound(e) {
                setPosition(e.latlng);
                currMap.flyTo(e.latlng, currMap.getZoom());
            },
        });

        return position === null ? null : ( <Marker position={position}></Marker> );
        
    };

    useImperativeHandle(props.ref, () => ({
        HandleClickMap,
    }));

    return <>
        <LeafletCss />
        <MapContainer
            center={{ lat: 0, lng: 0 }}
            zoom={13}
            ref={ref}
            scrollWheelZoom={false}
            className={style.mapContainer}
        >
            <TileLayer
                attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
                url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
            />
            <HandleClickMap />
        </MapContainer>
    </>;

}

const MapLoader = (props, ref) => {
    
    const [ reactLeaflet, setReactLeaflet ] = useState(null);
    useEffect(() => {
        const loadData = async () => {
            import('react-leaflet')
                .then(leaflet => setReactLeaflet(leaflet))
                .catch(error => noticeError(null, levels.error, error, "react-leaflet failed to load"));
        };

        loadData();
    }, []);

    return (reactLeaflet ? 
      <MyMap reactLeaflet={reactLeaflet} ref={ref} /> : 
      <LeafletCss /> 
    );
};

export default forwardRef(MapLoader);
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda