我使用 react-leaflet 来显示地图上相当长的路径。用户可以从列表中进行选择,我希望所选路径具有不同的颜色。更改状态和再次渲染太慢了,我正在寻找更快的解决方案。
Leaflet路径元素有setStyle()方法,所以我的第一个想法是使用它而不是再次渲染。但是如何引用传单层?
class MyPathComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
if (nextProps.selected){
this.setState({selected: true});
LEAFLET_POLYLINE.setStyle({
color: 'red'
});
}
return false;
}
render() {
return(
<Polyline polylines={this.props.path} />
);
}
}
那么我应该在这段代码中写下什么而不是 LEAFLET_POLYLINE ?
答案 0 :(得分:5)
react-leaflet
中的组件有一个名为leafletElement
的属性。我相信你可以这样做:
class MyPathComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
if (nextProps.selected){
this.setState({selected: true});
this.refs.polyline.leafletElement.setStyle({
color: 'red'
});
}
return false;
}
render() {
return(
<Polyline ref="polyline" polylines={this.props.path} />
);
}
}
有两点需要注意:
leafletElement
是此处的重要部分。而不是上面的代码,最好只扩展自定义组件的Polyline
组件(受限文档here):
import { Polyline } from 'react-leaflet';
class MyPathComponent extends Polyline {
shouldComponentUpdate(nextProps, nextState) {
if (nextProps.selected){
this.setState({selected: true});
this.leafletElement.setStyle({
color: 'red'
});
}
return false;
}
}
如果有任何问题可以告诉我。
答案 1 :(得分:0)
使用React回调ref并添加到上述@Eric的答案中的完整示例:
export default class MyMap extends Component {
leafletMap = null;
componentDidMount() {
console.debug(this.leafletMap);
}
setLeafletMapRef = map => (this.leafletMap = map && map.leafletElement);
render() {
return (
<Map
ref={this.setLeafletMapRef}
>
<TileLayer
attribution="Powered by <a href="https://www.esri.com">Esri</a>"
url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"
/>
</Map>
);
}
}