未跨多个 useEffects 定义的全局变量

Global variable not defined across multiple useEffects

我正在尝试设置一个根据 Redux 状态飞往不同位置的 Mapbox。我使用了两个 useEffects:第一个渲染地图,第二个根据状态变化飞到位置。我这样做是为了让地图不会在每次状态更改时都重新渲染,这会阻止平滑的 flyTo 动画。我试图在 useEffects 之外声明一个全局映射变量以赋予它全局范围,但是在状态更改时,第二个 useEffect 的映射变量未定义。

我无法找到一种无需重新渲染整个地图即可更新地图位置的方法。我认为第二个 useEffect 可以解决问题,但是这个全局声明的变量不起作用,我不确定为什么。

const Map = (props) => {
    
    mapboxgl.accessToken = 'ACCESS_TOKEN';

    const mapContainer = useRef(null);

    let map;

    useEffect(() => {

        map = new mapboxgl.Map({
            container: mapContainer.current
        });

    }, []);

    useEffect(() => {

        map.flyTo({
            center: [
                props.map.lng,
                props.map.lat
            ]
        })

        map.zoom = props.map.zoom;

        new mapboxgl.Marker().setLngLat(props.map).addTo(map);

    }, [props.map]);

    return (
        <div>
            <div ref={mapContainer} className={styles.mapContainer}/>
        </div>
    );
};

const mapStateToProps = state => {
    return {
        map: state.map
    }
}

export default connect(mapStateToProps)(Map);

map 在每个渲染周期重新声明,因此当第一个效果未设置时未定义。也使用 ref 来存储 map 。记得通过 map.current 访问以获取 ref.

的当前值
const Map = (props) => {
    
    mapboxgl.accessToken = 'ACCESS_TOKEN';

    const mapContainer = useRef(null);
    const map = useRef();

    useEffect(() => {

        map.current = new mapboxgl.Map({
            container: mapContainer.current
        });

    }, []);

    useEffect(() => {

        map.current.flyTo({
            center: [
                props.map.lng,
                props.map.lat
            ]
        })

        map.current.zoom = props.map.zoom;

        new mapboxgl.Marker().setLngLat(props.map).addTo(map.current);

    }, [props.map]);

    return (
        <div>
            <div ref={mapContainer} className={styles.mapContainer}/>
        </div>
    );
};