使用 react-leaflet 渲染 GeoJSON
Rendering GeoJSON with react-leaflet
我有一个简单的组件可以在地图上选择点,然后显示与该点相关的一些 GeoJSON 数据:
import React, { Component } from 'react';
import { Map, Marker, TileLayer, GeoJSON } from 'react-leaflet';
import 'leaflet/dist/leaflet.css';
import { connect } from 'react-redux';
import './style.css';
import { setPoint, fetchData } from '../../actions/map';
@connect(store => {
return {
map: store.map
}
})
class MyMap extends Component {
mapClick(e) {
this.props.dispatch(setPoint(e.latlng));
this.props.dispatch(fetchData(e.latlng));
}
render() {
const marker = () => {
if(this.props.map.point) {
return <Marker position={this.props.map.point} />;
}
};
const data = () => {
if(this.props.map.data.length > 0) {
const json = this.props.map.data;
return <GeoJSON data={json} />
}
}
return (
<div className='my-map'>
<div className='my-map__map-container'>
<Map center={this.props.map.center} zoom={13} onClick={this.mapClick.bind(this)}>
<TileLayer url='http://{s}.tile.osm.org/{z}/{x}/{y}.png' attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' />
{marker()}
{data()}
</Map>
</div>
<div className='my-map__debug'>
{JSON.stringify(this.props.map)}
</div>
</div>
);
}
}
export default MyMap;
然后我第一次点击地图标记出现,经过一些延迟(XHR 请求)GeoJSON 呈现。但下次我点击地图时,我只看到标记位置发生了变化,但旧的 GeoJSON 数据仍保留在地图上。组件的调试部分正确呈现,并显示正确的数据。我如何强制 react-leaflet
重新呈现我的 GeoJSON 数据或者我做错了什么?
UPD:
在询问 react-leafet
的作者后,我找到了如何达到预期的行为。
要强制做出反应以重新呈现我的 GeoJSON 数据,我需要将一些数据唯一键传递给组件:
<GeoJSON key={keyFunction(this.props.map.data.json)} data={this.props.map.data.json} />
https://github.com/PaulLeCam/react-leaflet/issues/332#issuecomment-304228071
从每次调用 render 方法时创建的函数调用标记和 geojson 的性能不会很高。另外,我认为您可能需要向地图元素添加一个键,以便它们可以被重新使用和正确更新。
试试这个:
render() {
return (
<div className='my-map'>
<div className='my-map__map-container'>
<Map center={this.props.map.center} zoom={13} onClick={this.mapClick.bind(this)}>
<TileLayer url='http://{s}.tile.osm.org/{z}/{x}/{y}.png' attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' />
{this.props.map.point &&
<Marker key='my-marker' position={this.props.map.point} />
}
{this.props.map.data.length > 0 &&
<GeoJSON key='my-geojson' data={this.props.map.data.json} />
}
</Map>
</div>
<div className='my-map__debug'>
{JSON.stringify(this.props.map)}
</div>
</div>
);
}
在询问 react-leafet
的作者后,我找到了如何达到预期的行为。
要强制做出反应以重新呈现我的 GeoJSON 数据,我需要将一些数据唯一键传递给组件:
<GeoJSON key={keyFunction(this.props.map.data.json)} data={this.props.map.data.json} />
https://github.com/PaulLeCam/react-leaflet/issues/332#issuecomment-304228071
import hash from 'object-hash';
render() {
let blah = this.state; //or this.props or whatever
<GeoJSON
key={hash(blah)}
data={blah} />
我有一个简单的组件可以在地图上选择点,然后显示与该点相关的一些 GeoJSON 数据:
import React, { Component } from 'react';
import { Map, Marker, TileLayer, GeoJSON } from 'react-leaflet';
import 'leaflet/dist/leaflet.css';
import { connect } from 'react-redux';
import './style.css';
import { setPoint, fetchData } from '../../actions/map';
@connect(store => {
return {
map: store.map
}
})
class MyMap extends Component {
mapClick(e) {
this.props.dispatch(setPoint(e.latlng));
this.props.dispatch(fetchData(e.latlng));
}
render() {
const marker = () => {
if(this.props.map.point) {
return <Marker position={this.props.map.point} />;
}
};
const data = () => {
if(this.props.map.data.length > 0) {
const json = this.props.map.data;
return <GeoJSON data={json} />
}
}
return (
<div className='my-map'>
<div className='my-map__map-container'>
<Map center={this.props.map.center} zoom={13} onClick={this.mapClick.bind(this)}>
<TileLayer url='http://{s}.tile.osm.org/{z}/{x}/{y}.png' attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' />
{marker()}
{data()}
</Map>
</div>
<div className='my-map__debug'>
{JSON.stringify(this.props.map)}
</div>
</div>
);
}
}
export default MyMap;
然后我第一次点击地图标记出现,经过一些延迟(XHR 请求)GeoJSON 呈现。但下次我点击地图时,我只看到标记位置发生了变化,但旧的 GeoJSON 数据仍保留在地图上。组件的调试部分正确呈现,并显示正确的数据。我如何强制 react-leaflet
重新呈现我的 GeoJSON 数据或者我做错了什么?
UPD:
在询问 react-leafet
的作者后,我找到了如何达到预期的行为。
要强制做出反应以重新呈现我的 GeoJSON 数据,我需要将一些数据唯一键传递给组件:
<GeoJSON key={keyFunction(this.props.map.data.json)} data={this.props.map.data.json} />
https://github.com/PaulLeCam/react-leaflet/issues/332#issuecomment-304228071
从每次调用 render 方法时创建的函数调用标记和 geojson 的性能不会很高。另外,我认为您可能需要向地图元素添加一个键,以便它们可以被重新使用和正确更新。
试试这个:
render() {
return (
<div className='my-map'>
<div className='my-map__map-container'>
<Map center={this.props.map.center} zoom={13} onClick={this.mapClick.bind(this)}>
<TileLayer url='http://{s}.tile.osm.org/{z}/{x}/{y}.png' attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' />
{this.props.map.point &&
<Marker key='my-marker' position={this.props.map.point} />
}
{this.props.map.data.length > 0 &&
<GeoJSON key='my-geojson' data={this.props.map.data.json} />
}
</Map>
</div>
<div className='my-map__debug'>
{JSON.stringify(this.props.map)}
</div>
</div>
);
}
在询问 react-leafet
的作者后,我找到了如何达到预期的行为。
要强制做出反应以重新呈现我的 GeoJSON 数据,我需要将一些数据唯一键传递给组件:
<GeoJSON key={keyFunction(this.props.map.data.json)} data={this.props.map.data.json} />
https://github.com/PaulLeCam/react-leaflet/issues/332#issuecomment-304228071
import hash from 'object-hash';
render() {
let blah = this.state; //or this.props or whatever
<GeoJSON
key={hash(blah)}
data={blah} />