请考虑以下代码:
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完全呈现之前运行。
答案 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} />
}