javascript - 如何处理 props 和 states 以避免无限循环?

标签 javascript reactjs mapbox-gl-js

我有一个从他的 parent 那里获取 Prop 的组件,我正在检查 componentDidUpdate() 中的 this.props.addMarker 是否为 true,如果为 true,则会触发一个包含 setState 的函数。

你可以想象接下来会发生什么:setState 触发 componentDidUpdate() 函数,该函数检查 this.props.addMarker 是否为 true...等等...

我应该怎样做才能避免此类问题?

这是我的代码:

componentDidUpdate() {  
    if(this.props.addMarker) {
      const place = this.props.coordinatesToCenter;
      const coord = place.coordinates;

      this.addMarkerProcess(place.place_name, place.place_type, coord.lon, coord.lat);
    }
}

addMarkerProcess(name, maki, xCoordinate, yCoordinate) {
    const data = {
      type: 'Feature',
      geometry: {
        type: 'Point',
        coordinates: [xCoordinate, yCoordinate]
      },
      properties: {
        // place:
        // login:
        lat: yCoordinate,
        lon: xCoordinate,
        color: "#00FFFF"
      }
    };

    if(this.state.clickIsEmpty) {
      data.properties.place = this.state.userNewPlaceInput;
      data.properties.login = this.state.userNewTypeInput;
    } else {
      data.properties.place = name;
      data.properties.login = maki;
    }

    const prevGeoJson = _.cloneDeep(this.state.geoJson);
    console.log("prevGeojson1", prevGeoJson)
    // map only rerenders geoJSONLayer if geoJSONLayer.data is a new instance:
    const geoJson = Object.assign({}, this.state.geoJson);
    geoJson.features.push(data);

    this.setState(prevState => ({
      prevGeoJson: prevGeoJson,
      geoJson: geoJson,
      currentMarker: data
    }));

    let canvas = document.querySelector('.mapboxgl-canvas');
    if(canvas.classList.contains("cursor-pointer")) {
      canvas.classList.remove("cursor-pointer");
    }
  }

最佳答案

componentDidUpdate() 会在更新后立即调用,因此,如果您在不使用条件包装的情况下调用 setState(),将不可避免地导致出现无限循环。 您可以根据新的和以前的 props 之间的比较来调用 setState()

componentDidUpdate(prevProps) {
    if(this.props.data !== prevProps.data) 
        this.fetchNewData(this.props.data);
}

关于javascript - 如何处理 props 和 states 以避免无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51847807/

相关文章:

javascript - 从 React.js 组件到 Node.js 服务器的 POST 请求出现问题

reactjs - 如何隔离使用 useState 钩子(Hook)的功能组件的不同实例之间的状态?

Mapbox GL JS : Style is not done loading

javascript - 使用 Mapbox gl js 将悬停时的弹出窗口添加到自定义标记

javascript - 无法将一个模态与多个按钮一起使用

javascript - 用于更新购物车的小型 jQuery 停止工作(Woocommerce/Wordpress)

javascript - React Router - 在嵌套组件内安装组件

javascript - 使用 Mapbox-gl-js 和 Django 的不同 map 图钉

javascript - 使用 webRequest 取消另一个扩展发出的请求

php - 如何在PHP中转义仅 "'”?