【问题标题】:React: setState causes app crash反应:setState 导致应用程序崩溃
【发布时间】:2016-09-16 16:33:39
【问题描述】:

我是 React 新手,出于学习目的,我现在创建了一些应用程序,该应用程序应该使用 react-google-map 显示城市或任何地址。问题是我不确定如何传达这些数据,我正在使用 axios 工具。

所以这里有一个链接 - pastebin。这是一个代码 sn-p,但我用注释分隔每个文件。我正在使用一些 EventEmitter 脚本来传递数据。问题是,当我在 google-map js 文件中设置状态时,它会无休止地启动到 console.log,不会重新渲染并崩溃选项卡。

问题已解决。希望,它也可能对其他人有所帮助。更改代码:

  class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      loc: {lat: undefined, lng: undefined}
    }
  }

  componentDidMount() {
    EventEmitter.subscribe('locationChanged', (data) => { 
      this.setState({loc: data});
    });
  }

  render() {
    const {lat, lng} = this.state.loc;
    var city = [];
    var key = lng + "" + lat;
    city.push(<GoogleMapComponent key={key} lat={lat} lng={lng} />);
    return (
        <div>
          <SearchBar />
          {city}
        </div>
      );
  }
}

我将 google_map 组件设为无状态:

import React from 'react';
import {GoogleMapLoader, GoogleMap} from "react-google-maps";

export default (props) => {
   if(props.lat === undefined) {
      return <div> &nbsp; </div>;
    };

  console.log(props.lat, props.lng);

  return (
    <GoogleMapLoader
      containerElement = { <div style={{ height: '60%' }} /> }
      googleMapElement = {
        <GoogleMap defaultZoom = {12} defaultCenter = {{ lat: props.lat, lng: props.lng }} />
      }
    />
  );
}

【问题讨论】:

  • 请在您的帖子中直接包含相关帖子。
  • 对不起。邮寄是什么意思?
  • @FelixKling,您是指问题中的整个代码吗?
  • 相关代码,是的。

标签: reactjs


【解决方案1】:

问题是您在 render 函数中订阅了您的事件发射器,每当您设置状态时都会调用它,它重新订阅,设置状态并调用 render 重新订阅和设置状态.....

将此逻辑上移至componentDidMount,它将只订阅一次。

class GoogleMapComponent extends Component {
  constructor() {
    super();
    this.state = {
      loc: {lat: 50, lng: 40}
    }
  }

  componentDidMount() {
    EventEmitter.subscribe('locationChanged', (data) => { 
      this.setState({loc: data});
    });
  }

  render() { .. }
}

【讨论】:

  • 谢谢,它确实解决了无限执行的问题,但它不会重新渲染,即使状态发生了变化。
  • 它是否调用渲染?如果您将控制台日志放在render 中,它会命中吗?此外,您的事件发射器回调是否被击中?那个控制台日志还在工作吗?
  • 是的,确实如此。也许这是 react-google-map 的问题,我应该调查一下。再次感谢。
  • 我想确保你的 data 对象格式正确,但你是对的,它可能是别的东西。
  • 您能用您的更改更新您的问题吗?您可能还可以删除不相关的代码。
猜你喜欢
  • 2015-10-21
  • 2016-06-04
  • 2011-08-24
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多