javascript - React 组件成功后响应继续执行

标签 javascript reactjs response

我有一个父组件和子组件。子项是以特定坐标为中心的 map 。在表单提交时,我通过传递来自父组件的 Prop (坐标)来更新子组件中的 map 坐标。坐标是根据用户输入的地址字符串进行地理编码的。

一切正常,只是响应虽然成功,但却无限循环。一分钟后,这会让我的浏览器崩溃。

我应该如何阻止响应每秒更新?

代码如下:

import React, { Component } from 'react';
import { Map, TileLayer } from 'react-leaflet';
import Geocode from "react-geocode";

class MapContainer extends Component {
    constructor(props) {
        super(props);
    }

    componentWillReceiveProps(nextProps) {
        this.setState({centerMap: {
            lat: nextProps.lat,
            lng: nextProps.lng
        }})
    }

    render() {
        return (
          <Map center={this.props.centerMap} zoom={13} >
            <TileLayer
            attribution="&amp;copy <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
            url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
            />
          </Map>
        );
    }
}

class Card extends Component {
    constructor(props) {
        super(props);
        this.state = {
            userCoords: {
                lat: 91.93373,
                lng: -81.4280
            }
        }
    }

    render() {
        let data = this.props.data;

        // set Google Maps Geocoding API for purposes of quota management. Its optional but recommended.
        Geocode.setApiKey("MY_API_KEY");

        // Get latidude & longitude from address.
        Geocode.fromAddress(data.location).then(
          response => {
              const coords = response.results[0].geometry.location;

              this.setState({
                  userCoords: {
                      lat: coords.lat,
                      lng: coords.lng
                  }
              })
          },
          error => {
            console.error(error);
          }
        );

        return (
            <main className="main-card">
                <div className="main-card--header-bg">
                    <MapContainer centerMap={this.state.userCoords}/>
                </div>
            </main>
        );
    }
}

export default Card;

最佳答案

移动

Geocode.setApiKey("MY_API_KEY"); 到构造函数或全局。

然后创建一个方法说

fetchCoords(location) {
  Geocode.fromAddress(location).then(
          response => {
              const coords = response.results[0].geometry.location;

              this.setState({
                  userCoords: {
                      lat: coords.lat,
                      lng: coords.lng
                  }
              })
          },
          error => {
            console.error(error);
          }
        );

}

现在在Wrapper组件中写入componentDidMount和componentDidUpdate

componentDidMount() {
 let data = this.props.data;
 this.fetchCoords(data.location);  
}
componentDidUpdate(prevProps) {
  if(this.props.data != prevProps.data) {
    let data = this.props.data;
    this.fetchCoords(data.location); 
  }
}

componentDidMount 将获取坐标并将其设置为状态,从而触发重新渲染。所以 componentDidUpdate 将被调用,因为 props 没有改变,它不会再次调用 fetchCoords 。现在,如果 props.data 更改,将调用 componentDidUpdate,此时 props 将是新的,并且将启动新的获取。

关于javascript - React 组件成功后响应继续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601488/

相关文章:

ios - Ipad 上的 React Native - 错误 - 无法连接到开发服务器

reactjs - 未捕获的 EvalError : Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in Content Security Pol

javascript - 从不同的组件触发组件渲染而不渲染整个页面

reactjs - 使用 SWAPI(星球大战 API)的 React 项目出现混合内容错误

php - symfony 从 url 下载视频

php - 是否可以在 PHP 中延迟 HTTP 响应?

javascript - 如何从 window.fetch() 响应中获取数据?

Javascript 在 switch case 中进行多重决策

Javascript:更改 z-index onclick

javascript - 如何访问 CouchDB 文档的字段