Подтвердить что ты не робот

Хороший способ объединить Реакт и Листовку

Я работаю над проектом, чтобы объединить React и 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="#" onclick="location.href='http://openstreetmap.org'; return false;">OpenStreetMap</a> contributors, <a href="#" onclick="location.href='http://creativecommons.org/licenses/by-sa/2.0/'; return false;">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
        )
    });
})();

Итак, мои вопросы:

  • Этот пример кажется законным?
  • Как вы подходите к логике добавления маркеров и управления их событиями?
4b9b3361

Ответ 1

  • Вам не нужно управлять уникальностью, то есть "UID", самостоятельно. Вместо этого вы можете использовать getDOMNode для доступа к компоненту real node. API-интерфейс Leaflet поддерживает либо селектор строк, либо экземпляр HTMLElement.
  • Листовка управляет рендерингом, поэтому map не должен жить на state. Сохраняйте данные только в state, которые влияют на рендеринг React элемента DOM.

Помимо этих двух пунктов, обычно используйте API-интерфейс Leaflet и связывайте обратные вызовы от вашего компонента React к карте Leaflet, как вам нравится. Реакт - это просто обертка в этой точке.

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>
        );
    }

}

Ответ 2

Как дополнительный, менее подробный ответ, компонент реакции-листовки PaulLeCam кажется популярным. Еще не использовали его, но он выглядит многообещающим:

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

UPDATE: Он прочный. Не использовали многие из функций, но кодовая база хорошо написана и проста в использовании и расширении, и то, что я использовал, отлично работает из коробки.