Skip to content
This repository has been archived by the owner on Sep 10, 2024. It is now read-only.

Where to add idle event in the react #4

Closed
MikeChenfu opened this issue Dec 9, 2019 · 6 comments
Closed

Where to add idle event in the react #4

MikeChenfu opened this issue Dec 9, 2019 · 6 comments

Comments

@MikeChenfu
Copy link

Hello, I try adding idle event into the react componentDidMount() or componentDidUpdate(). However, it seems to not work. I appreciate if anyone can help me.

@tristen
Copy link
Member

tristen commented Dec 9, 2019

👋 @MikeChenfu can you share a code example and what example you tried this from? My guess is that your version of mapbox-gl is out of date. The idle event was introduced in v0.52.0.

@MikeChenfu
Copy link
Author

Thanks @tristen for the quick reply. I have done a demo without react. Currently, I am moving my mapbox+js into the react framework. Here is my code.

Html:

<!DOCTYPE html>
<html lang='en'>
<head>
  <title></title>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <link href='https://api.mapbox.com/mapbox-assembly/mbx/v0.18.0/assembly.min.css' rel='stylesheet'>
  <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.39.1/mapbox-gl.css' rel='stylesheet' />
</head>
<body>
  <div id='app'></div>
  <script src='https://api.mapbox.com/mapbox-assembly/mbx/v0.18.0/assembly.js'></script>
</body>
</html>

Js

class Application extends React.Component {
  map;

  constructor(props: Props) {
    super(props);
  }

  componentDidUpdate() {
    this.getFeatures();
  }

  componentDidMount() {
    this.map = new mapboxgl.Map({
      container: this.mapContainer,
      style: 'mapbox://styles/mapbox/dark-v9',
      center: [5, 34],
      zoom: 1.5
    });

    this.map.on('load', () => {
      this.map.addSource("state-population", {
        'type': 'vector',
        'url': sourceMatch["state-population"]
       });
      this.map.addLayer({
        'id': "state-2d",
        'source': "state-population",
        'source-layer': 'states',
        'type': 'fill',
        'layout': {
          'visibility': 'visible'
           },
        'paint': {"fill-opacity":0.8}
       }, 'waterway-label');   
     });

     this.getFeatures();
   }

   getFeatures = () => {
      console.log('addColor');
      this.map.on("idle",() => {
          let featuresAll = this.map.queryRenderedFeatures({layers: ['state-2d']});
          console.log(featuresAll)
          console.log(this.map.isSourceLoaded('state-population'));
       });
}

When I run this demo, there is no any output about featuresAll. I doubt the idle event is not running.

@tristen
Copy link
Member

tristen commented Dec 9, 2019

My guess is that your version of mapbox-gl is out of date. The idle event was introduced in v0.52.0.

@MikeChenfu
Copy link
Author

MikeChenfu commented Dec 9, 2019

Thanks @tristen. I have updated it to the latest version. However, it still has the same problem. In the getFeature function, 'addColor' can be printed in the console, but console.log(featuresAll)does not have any output.

package.json

{
  "name": "basic",
  "version": "0.0.0",
  "scripts": {
    "start": "react-scripts start"
  },
  "devDependencies": {
    "react-scripts": "^1.0.17"
  },
  "dependencies": {
    "mapbox-gl": "^1.6.0",
    "react": "^16.2.0",
    "react-dom": "^16.2.0"
  }
}

Html

<!DOCTYPE html>
<html lang='en'>
<head>
  <title></title>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <link href='https://api.mapbox.com/mapbox-assembly/v0.24.0/assembly.min.css' rel='stylesheet'>
  <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v1.6.0/mapbox-gl.css' rel='stylesheet' />
</head>
<body>
  <div id='app'></div>
  <script src='https://api.mapbox.com/mapbox-assembly/v0.24.0/assembly.js'></script>
</body>
</html>

@MikeChenfu
Copy link
Author

I try the moveendevent and it works. Is there any limitation on the idle event? Thanks.

getFeatures = () => {
    this.map.on("moveend",() => {
      let featuresAll = this.map.queryRenderedFeatures({layers: ['state-2d']});
      console.log(featuresAll)
      console.log(this.map.isSourceLoaded('state-population'));
    });
  }

@MikeChenfu
Copy link
Author

@tristen I have solved this problem. I updated the package file but does not install it. New package works well. Thanks for your kind help.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants