在对话框材质UI上无法显示Mapbox

时间:2020-08-20 04:33:38

标签: reactjs dialog material-ui mapbox mapbox-gl-js

请考虑以下代码:

import React, { useEffect, useState } from 'react';
import { Dialog } from '@material-ui/core';
import mapboxgl from 'mapbox-gl';

export default function UseMapbox() {
  const classes = useStyles();
  mapboxgl.accessToken = token;
  const mapRef = React.useRef();

 
  useEffect(() => {
    const map = new mapboxgl.Map({
      container: mapRef.current,
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [10, 10],
      zoom: 9
    });
  }, []);


  return (
    <Dialog
      open
      onClose={onClose}
    >

      <div ref={mapRef} className={classes.map} />
    </Dialog>
  );
}

我面临的问题是 mapRef.current 未定义。 如果我不使用对话框,它将正常运行。所以我认为useEffect已经在Dialog完全呈现之前运行。

1 个答案:

答案 0 :(得分:0)

直接使用mapbox-gl时,我遇到了类似的问题。

我通过添加一个包装程序而不是直接引用它来解决它:

import React, { useEffect, useState } from 'react';
import { Dialog } from '@material-ui/core';
import mapboxgl from 'mapbox-gl';

export default function UseMapbox() {
  return (
    <Dialog open onClose={onClose}>
      <MapboxWrapper />
    </Dialog>
  );
}

const MapboxWrapper = () => {
  const classes = useStyles();
  
  useEffect(() => {
    const map = new mapboxgl.Map({
      container: mapRef.current,
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [10, 10],
      zoom: 9
    });
  }, []);


  return <div ref={mapRef} className={classes.map} />
}