我最终得到了一个类似于@teddybeard 所说的答案。如果我只是div
按照建议使用类创建了新的,它将被放置在任何默认控件之上,例如ZoomControl
or ScaleControl
。相反,我所做的是div
从 DOM 中获取实际位置容器,然后在该容器中创建一个 ReactDOM 门户并以这种方式添加我的控件。
它可以工作,不存在由于 React Effect 在每次渲染上删除和重新添加控件而导致的视觉闪烁问题,并且我仍然获得相同的定位。
它位于https://github.com/chris-m92/react-leaflet-custom-control和https://npmjs.com/package/react-leaflet-custom-control的 npm 和 github 上
const POSITION_CLASSES = {
bottomleft: 'leaflet-bottom leaflet-left',
bottomright: 'leaflet-bottom leaflet-right',
topleft: 'leaflet-top leaflet-left',
topright: 'leaflet-top leaflet-right',
}
const Control = (props: Props): JSX.Element => {
const [container, setContainer] = React.useState<any>(document.createElement('div'))
const positionClass = (props.position && POSITION_CLASSES[props.position] || POSITION_CLASSES.topright)
React.useEffect(() => {
const targetDiv = document.getElementsByClassName(positionClass)
setContainer(targetDiv[0])
}, [])
const controlContainer = (
<div className='leaflet-control leaflet-bar'>{props.children}</div>
)
L.DomEvent.disableClickPropagation(container)
return ReactDOM.createPortal(
controlContainer,
container
)
}
export default Control