结合 React 和 Leaflet 的好方法

IT技术 javascript leaflet reactjs
2021-04-25 07:16:40

我正在做一个结合 React 和 Leaflet 的项目,但我必须说我在语义方面遇到了一些困难。

由于大多数东西都是由 Leaflet 直接管理的,我不知道将 Leaflet 地图实例添加为 React 组件中的状态是否有意义。

使用 Leaflet 创建标记时存在同样的问题,因为它不返回任何内容,因此我实际上没有任何内容要渲染。逻辑本身对我来说似乎很模糊。

这是我开始制作的。它正在工作,但我觉得我正在编写糟糕的代码并且缺少概念。

/** @jsx React.DOM */

/* DOING ALL THE REQUIRE */
var Utils = require('../core/utils.js');

var Livemap = React.createClass({
    uid: function() {
        var uid = 0;
        return function(){
            return uid++;
        };
    },
    getInitialState: function() {
        return {
            uid: this.uid()
        }
    },
    componentDidMount: function() {
        var map = L.map('map-' + this.state.uid, {
            minZoom: 2,
            maxZoom: 20,
            layers: [L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: '&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'})],
            attributionControl: false,
        });
        map.fitWorld();
        return this.setState({
            map: map
        });
    },
    render: function() {
        return (
            <div className='map' id={'map-'+this.state.uid}></div>
        );
    }
});

(function(){
    Utils.documentReady(function(){
        React.render(
            <Livemap />,
            document.body
        )
    });
})();

所以我的问题是:

  • 这个样本看起来合法吗?
  • 您将如何处理添加标记和管理其事件的逻辑?
2个回答
  • 您不需要自己管理唯一性,即“UID”。相反,您可以使用getDOMNode访问组件的真实节点。Leaflet 的 API 支持字符串选择器或 HTMLElement 实例。
  • Leaflet 正在管理渲染,所以不map应该在state. 只存储state影响 React 渲染 DOM 元素的数据。

除了这两点之外,正常使用 Leaflet API 并根据需要将来自 React 组件的回调绑定到 Leaflet 地图。在这一点上,React 只是一个包装器。

import React from 'react';
import ReactDOM from 'react-dom';

class Livemap extends React.Component {

    componentDidMount() {
        var map = this.map = L.map(ReactDOM.findDOMNode(this), {
            minZoom: 2,
            maxZoom: 20,
            layers: [
                L.tileLayer(
                    'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
                    {attribution: '&copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'})
            ],
            attributionControl: false,
        });

        map.on('click', this.onMapClick);
        map.fitWorld();
    }

    componentWillUnmount() {
        this.map.off('click', this.onMapClick);
        this.map = null;
    }

    onMapClick = () => {
        // Do some wonderful map things...
    }

    render() {
        return (
            <div className='map'></div>
        );
    }

}

作为额外的、不太详细的答案,PaulLeCam 的 react-leaflet 组件似乎很受欢迎。还没有使用它,但它看起来很有希望:

https://github.com/PaulLeCam/react-leaflet

更新:它很坚固。尚未使用许多功能,但代码库编写良好且易于遵循和扩展,而且我使用的功能开箱即用。