通过使用很棒的字体自定义反应传单标记图标

时间:2018-08-29 16:51:52

标签: leaflet font-awesome react-leaflet

这是理论上的问题,而不是问题。

如何将真棒字体图标用作 反应叶地图标记图标

我想要一个这样的图标选择器控件来分配(自定义)我在地图上获得的每个标记图标。顺便说一下,我正在使用Map和Marker的JSX组件。

有可能实现这一目标吗?

有人对此有样品笔吗?我确实在Google上进行了强烈的搜索,但是找不到一个插件,只有一个仅可用于Leaflet 1.0的fontawesome插件。

任何想法都值得赞赏。

谢谢。

3 个答案:

答案 0 :(得分:1)

由于某些原因,代码未格式化。查看code sandbox

上的代码

这是如何使用超棒字体图标作为标记的方法。

  1. 将真棒的CDN添加到您的index.html

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">

  1. 使用divIcon中的renderToStaticMarkupreact-dom/server来生成标记图标。将此divIcon作为Marker道具传递给icon

    import React, { Component } from 'react';
    import ReactDOM from 'react-dom';
    import { renderToStaticMarkup } from 'react-dom/server';
    import { divIcon } from 'leaflet';
    import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
    
    import './styles.css';
    
    class App extends Component {
      state = {
        lat: 51.505,
        lng: -0.091,
        zoom: 13,
      };
    
    render() {
        const position = [this.state.lat, this.state.lng];
        const iconMarkup = renderToStaticMarkup(<i className=" fa fa-map-marker-alt fa-3x" />);
        const customMarkerIcon = divIcon({
          html: iconMarkup,
        });
    
        return (
          <Map center={position} zoom={this.state.zoom}>
            <TileLayer
              attribution="&amp;copy <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
              url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
            />
            <Marker position={position} icon={customMarkerIcon}>
              <Popup>
                A pretty CSS3 popup. <br /> Easily customizable.
              </Popup>
            </Marker>
          </Map>
        );
      }
    }
    
    const rootElement = document.getElementById('root');
    ReactDOM.render(<App />, rootElement);
    
  2. 通过将以下类添加到CSS文件中来覆盖divIcon默认样式

    .leaflet-div-icon {
        background: transparent;
        border: none;
    }  
    

答案 1 :(得分:0)

对于已经使用Fontawesome(FontAwesomeIcon)的React组件的用户,有一种解决方案不需要再次通过CDN导入。它使用与Murli答案相同的原理,但是您可以不添加<i className=" fa fa-map-marker-alt fa-3x" />,而可以将FontAwesomeIcon组件转换为html,然后将其传递给divIcon的html属性。看起来像这样(适应接受的答案的示例):

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import ReactDOMServer from 'react-dom/server';
import Leaflet from 'leaflet'
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';

import './styles.css';

// FontAwesome requirements
import { faUserAstronaut } from '@fortawesome/free-solid-svg-icons'
library.add(faUserAstronaut)

class App extends Component {
  state = {
    lat: 51.505,
    lng: -0.091,
    zoom: 13,
  };

render() {
    const position = [this.state.lat, this.state.lng];
    const iconHTML = ReactDOMServer.renderToString(<FontAwesomeIcon icon='user-astronaut' />)
    const customMarkerIcon = new Leaflet.DivIcon({
      html: iconHTML,
    });

    return (
      <Map center={position} zoom={this.state.zoom}>
        <TileLayer
          attribution="&amp;copy <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
          url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
        />
        <Marker position={position} icon={customMarkerIcon}>
          <Popup>
            A pretty CSS3 popup. <br /> Easily customizable.
          </Popup>
        </Marker>
      </Map>
    );
  }
}

const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);

答案 2 :(得分:0)

创建 divIcon 并将其插入到 icon 属性中:

// marker-icons.js
import L from 'leaflet';

const factory = new L.divIcon({
  className: '',
  iconAnchor: [12, 25],
  labelAnchor: [-6, 0],
  popupAnchor: [0, -15],
  iconSize: [25, 41],
  html: `<span class="fa fa-industry"></span>`
});

export default { factory };

在组件文件中使用图标:

// component.js
import { factory } from './marker-icons';

<MapContainer center={[12.23432, 87.234]} zoom={6} scrollWheelZoom={false}>
    <TileLayer attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"/>
    <Marker position={45.4534, 23.43]} icon={factory}>
        <Popup>Help text</Popup>
    </Marker>
</MapContainer>