如何参考反应小叶组件的小叶层?

时间:2016-07-30 22:02:55

标签: reactjs leaflet react-leaflet

我使用 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

2 个答案:

答案 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} />
    );
  }
}

有两点需要注意:

  1. 我还没有测试过这段代码,所以可能需要一些小的调整。
  2. 使用字符串&#34; ref&#34;在React中被认为是遗留的,因此您可能希望做一些稍微不同的事情(请参阅here)。 leafletElement是此处的重要部分。
  3. 而不是上面的代码,最好只扩展自定义组件的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=&quot;https://www.esri.com&quot;>Esri</a>"
          url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"
        />
      </Map>
    );
  }
}