Redux用于映射应用程序

时间:2016-03-07 14:00:39

标签: reactjs leaflet redux

我知道redux非常适合处理应用程序的全局状态,并且当更新该状态以反映视图中的状态时。但是,是否可以在不应该重新渲染的反应组件上使用它?我有一个使用传单而不是重新渲染和绘制数据的地图,我希望它能够在不重新渲染的情况下绘制数据。

redux似乎是个不错的选择吗?如果是这样,我会在哪里处理api调用,因为我被告知它不应该在减速器中完成。

目前我的应用程序包含一个导航栏,一个全屏地图和一个从api请求填充的搜索菜单。我们的想法是,当选择搜索时,它会将数据填充到地图上。

2 个答案:

答案 0 :(得分:1)

您能否分享一下如何使用Leaflet和React而不使用Redux?

本质上,如果React组件的状态发生变化,它们将始终重新呈现,因此您可以拥有可在每次更改时更新的React组件,或者在每个订阅状态更改时更新的Redux连接组件。两种方式都没有区别。

如果您希望React / Redux能够意识到'您的传单小部件,唯一的方法是让它在更改时重新呈现。请记住,“渲染”'函数不会丢弃并重建DOM的那一部分,因此重新渲染每个更改都不会导致您的传单组件被销毁和重建。

您可以连接Redux调度程序而不是状态,以便您可以通过redux将更改发布到服务器,但不能连接状态。这似乎不是理想的使用方法。

另一种方法是拥有一个持久的MapCoordinates'仅在用户确认其选择时设置的属性,而不是每次更改时设置的属性。这样重新渲染只发生在他们锁定变化时,而不是每次小调整。

为了进行API调用,您将要使用redux thunk和中间件。有很多关于这方面的信息:)

答案 1 :(得分:1)

如果您的组件没有重新渲染,那么我建议不要将它与Redux复杂化。听起来你只需要一个管理自己渲染的组件。

var MyMapComponent = React.createClass({
  componentWillMount: function() {
    fetch('/some/data')
     .then(this.update);
  },
  update: function(data) {
    // calling setState will trigger shouldComponentUpdate
    this.setState({ data: data });
  },
  loadMap: function(container) {
    // calling setState will trigger shouldComponentUpdate
    this.setState({
      map: L.map(container)
    });
  },
  shouldComponentUpdate: function(nextProps, nextState) {
    var map = this.state.map;
    var data = this.state.data;

    // make updates to map here

    // prevent react from re-rendering this component
    return false;
  },
  render: function() {
    // pass a reference to the dom node out to loadMap
    return (
      <div ref={this.loadMap}></div>
    );
  }
});