Leaflet Popup 中的 Reagent component - 自定义 Leaflet Popup
Reagent component in Leaflet Popup - Customize Leaflet Popup
我正在使用 Re-Frame 和 Reagent 构建一个 Clojurescript 前端。目前,前端仅包含使用 Leaflet 创建的地图。单击地图时,一个新标记将设置到该位置。单击这些标记中的任何一个时,都会显示一个弹出窗口。
到目前为止一切顺利。现在的问题是,我想准确地调整这个 Leaflet 弹出窗口,使其也包含一个删除按钮,然后应该使用该按钮再次删除标记。这是我遇到问题的地方。代码如下所示(归结为最小值):
(setup-map!
(-> js/L
(.map "mapid")
(.setView #js [12.34 56.78] 10))]
(.on map "click" add-marker-to-map! (aget % "latlng" "lat") (aget %
"latlng" "lng"))))
(defn add-marker-to-map!
[lat long map-object]
(-> js/L
(.marker #js [lat long])
(.addTo map-object)
(.bindPopup "<div>Hello World!</div>")
这也行。但我不想将内联 HTML 写成字符串。我想用 hiccup 语法编写弹出窗口的内容,然后以某种方式将其传递给“.bindPopup”。我想这样做,因为单击将包含一些 Clojurescript,如果我只是将 HTML 内联写为字符串,我不能将其放入其中。
例如,我尝试使用:
(.bindPopup (reagent.dom.server/render-to-string [:div "Hello World"]))
这也可以正常工作,但是我放在那里的任何点击都会在翻译中丢失。我知道这种方式行不通(请参阅 or )。
因此我想找到另一种方法将我的 Reagent(只是包装 React)组件传递给 Leaflet,以便它满足弹出的界面:
setContent(<String|HTMLElement|Function> htmlContent)
(https://leafletjs.com/reference-1.3.2.html#popup-setcontent)
所以基本上我想将组件渲染到 HTML 元素中而不是直接渲染到虚拟 DOM 中。我想调用试剂渲染函数并且不将结果渲染到应用程序中,而是将其作为我可以传递给 Leaflet 的 HTML 元素返回。
(reagent/render [hello] (.getElementById js/document "app"))
TLDR:如何将 Reagent 组件渲染到 HTML 元素中,包括其点击功能,以便我可以将其交给 Leaflet 弹出窗口?
感谢任何帮助。
您可以使用自己的 DOM 容器来渲染元素:
(def custom-parent (atom (dom/createDom "div")))
我假设你需要的不只是一个,但为了简洁起见,我有一个。
(defn add-marker-to-map!
[evt]
(let [evt (js->clj evt :keywordize-keys true)
{{:keys [lat lng]} :latlng} evt]
(-> js/L
(.marker #js [lat lng])
(.addTo m)
(.bindPopup (r/render [:div "Marker here"
[:br]
[:button {:on-click (fn [] (js/console.log "clicked"))} "delete me"]]
@custom-parent)))))
我正在使用 Re-Frame 和 Reagent 构建一个 Clojurescript 前端。目前,前端仅包含使用 Leaflet 创建的地图。单击地图时,一个新标记将设置到该位置。单击这些标记中的任何一个时,都会显示一个弹出窗口。
到目前为止一切顺利。现在的问题是,我想准确地调整这个 Leaflet 弹出窗口,使其也包含一个删除按钮,然后应该使用该按钮再次删除标记。这是我遇到问题的地方。代码如下所示(归结为最小值):
(setup-map!
(-> js/L
(.map "mapid")
(.setView #js [12.34 56.78] 10))]
(.on map "click" add-marker-to-map! (aget % "latlng" "lat") (aget %
"latlng" "lng"))))
(defn add-marker-to-map!
[lat long map-object]
(-> js/L
(.marker #js [lat long])
(.addTo map-object)
(.bindPopup "<div>Hello World!</div>")
这也行。但我不想将内联 HTML 写成字符串。我想用 hiccup 语法编写弹出窗口的内容,然后以某种方式将其传递给“.bindPopup”。我想这样做,因为单击将包含一些 Clojurescript,如果我只是将 HTML 内联写为字符串,我不能将其放入其中。
例如,我尝试使用:
(.bindPopup (reagent.dom.server/render-to-string [:div "Hello World"]))
这也可以正常工作,但是我放在那里的任何点击都会在翻译中丢失。我知道这种方式行不通(请参阅
因此我想找到另一种方法将我的 Reagent(只是包装 React)组件传递给 Leaflet,以便它满足弹出的界面:
setContent(<String|HTMLElement|Function> htmlContent)
(https://leafletjs.com/reference-1.3.2.html#popup-setcontent)
所以基本上我想将组件渲染到 HTML 元素中而不是直接渲染到虚拟 DOM 中。我想调用试剂渲染函数并且不将结果渲染到应用程序中,而是将其作为我可以传递给 Leaflet 的 HTML 元素返回。
(reagent/render [hello] (.getElementById js/document "app"))
TLDR:如何将 Reagent 组件渲染到 HTML 元素中,包括其点击功能,以便我可以将其交给 Leaflet 弹出窗口?
感谢任何帮助。
您可以使用自己的 DOM 容器来渲染元素:
(def custom-parent (atom (dom/createDom "div")))
我假设你需要的不只是一个,但为了简洁起见,我有一个。
(defn add-marker-to-map!
[evt]
(let [evt (js->clj evt :keywordize-keys true)
{{:keys [lat lng]} :latlng} evt]
(-> js/L
(.marker #js [lat lng])
(.addTo m)
(.bindPopup (r/render [:div "Marker here"
[:br]
[:button {:on-click (fn [] (js/console.log "clicked"))} "delete me"]]
@custom-parent)))))