React.js / Leaflet -- 运行 useEffect on Mount only in DevServer

React.js / Leaflet -- Run useEffect on Mount only in DevServer

我正在 运行 关注这种行为,我 必须 运行 useEffect Hook 在反应中只有一次。 原因主要是因为我必须初始化一个不能超过一次的 leaflet.js 映射。

但是每当我更改组件 jsx 中的某些内容时,DevServer 的“热重载”功能似乎忽略了 useEffects 第二个参数 [] 并重新 运行 它无论如何,尽管状态coachmap 坚持。此行为会引发错误:map is already initialised,只能通过重新加载浏览器选项卡来修复。

你知道如何防止对重新初始化传单做出反应吗?

我已经尝试检查 typeof coachmap == 'undefined' 是否仍然奇怪地重新初始化地图。

这是我的组件代码:

import * as L from "leaflet/dist/leaflet";
import "leaflet/dist/leaflet.css";
import { useEffect } from "react";

function CoachMap() {
  useEffect(() => {
    if (typeof coachmap == "undefined") {
      // Initialise Leaflet.js Map
      const coachmap = L.map("coach-map").setView([51.505, -0.09], 13);
    }
  }, []);

  return (
    <div className="container mx-auto my-4 ab">
      <div id="coach-map"></div>
    </div>
  );
}

export default CoachMap;

既然你的组件是直接在App.js中调用的,为什么不用React.memo包装组件呢? (这将防止不必要的重新渲染)

export default React.memo(CoachMap);

别忘了导入 'React'

import React, {useEffect} from "react"

您还可以将 useEffect 替换为 useMemo,因为您打算记住该值而不是实际触发副作用。

const coachmap = React.useMemo(()=>{
  return L.map("coach-map").setView([51.505, -0.09], 13)
}, []);