Leafletを使用してアプリに取り組んでいます( react-leaflet経由)。Leaflet は DOM を直接操作します。react-leaflet ライブラリはそれを変更しません。React フレンドリーな方法で Leaflet マップを制御するために使用できる React コンポーネントを提供するだけです。
このアプリでは、いくつかの単純な要素を含む div であるカスタム マップ マーカーを使用したいと考えています。Leaflet でこれを行う方法は、マーカーのicon
プロパティをDivIconに設定することです。これにより、カスタム HTML を設定できます。DivIcon のhtml
プロパティを HTML を含む文字列に設定することで、その内部 HTML を設定します。私の場合、その HTML を React コンポーネントからレンダリングしたいと考えています。
そのためにはReactDOMServer.renderToString()
、マップ マーカー内に必要なコンポーネントを文字列にレンダリングし、それをhtml
DivIcon のプロパティとして設定するのが正しい方法のようです。
MyMarker.js:
import React, { Component } from 'react'
import { renderToString } from 'react-dom/server'
import { Marker } from 'react-leaflet'
import { divIcon } from 'leaflet'
import MarkerContents from './MarkerContents'
export class MyMarker extends Component {
render() {
const markerContents = renderToString(<MarkerContents data={this.props.data} />)
const myDivIcon = divIcon({
className: 'my-marker',
html: markerContents
})
return (
<Marker
position={this.props.position}
icon={myDivIcon} />
)
}
}
ただし、React docsによると:
この [renderToString] は、サーバー上でのみ使用する必要があります。
これは厳密なルールですか、それとも ReactDOM の DOM の効率的な管理を回避することを思いとどまらせることだけを意図したものですか?
私が求めていることを達成するための別の (より良い) 方法は考えられません。コメントやアイデアは大歓迎です。