neo4j 未显示Reactjs更新的属性

qjp7pelc  于 2022-11-05  发布在  React
关注(0)|答案(2)|浏览(160)

我尝试创建一个可交互的Map,下面是这个例子:https://docs.mapbox.com/mapbox-gl-js/example/cluster/
在我的componentDidMount中(我在其中创建了一个mapboxgl),我实现了可点击的标记,当点击标记时,会出现一个弹出窗口,显示各种信息。
单击后,我想调用第二个函数(fetch)来获取有关该特定标记的更多数据:this.props.getData(id);然后,我想在与其他信息相同的弹出窗口中显示这些数据。
我的问题是第一次单击时this.props.testdata是空的。如果我双击标记,数据就会出现。所以我的猜测是我的组件没有注意到状态/属性的变化,因此没有更新?
我该怎么做呢?我错过了什么?
Map.js

this.map.on('click', 'unclustered-point', (e) => {

            const coordinates = e.features[0].geometry.coordinates.slice();

            const id = e.features[0].properties.id;
            const infos = e.features[0].properties.infos;

            while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
                coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
            }

            if (id == null) {
                console.log("Missing id, cant get informations")
                return;
            }

            this.props.getData(id);

            new mapboxgl.Popup()
                .setLngLat(coordinates)
                .setHTML(
                    `
                    Id: ${id}
                        <br>
                     Infos: ${infos}
                        <br>
                        <br>
                     Testdata: ${this.props.testdata}
                    `
                )
                .addTo(this.map);
        });

        this.map.on('mouseenter', 'clusters', () => {
            this.map.getCanvas().style.cursor = 'pointer';
        });
        this.map.on('mouseleave', 'clusters', () => {
            this.map.getCanvas().style.cursor = '';
        });
    });

App.js(获取数据函数):

getData = (id) => {
  if (id== null) {
      console.log("Missing id")
      return;
  }

const {mapCenter, startDate, endDate} = this.state;
const neo4j = require('neo4j-driver')
const driver = neo4j.driver('bolt://xxx', neo4j.auth.basic("xx", "xx-xx"))
const session = driver.session()

session
    .run('Here goes a neo4j cypher statment',{id: id})
    .then((results)=> {

      const data= [];
      results.records.forEach((record) => data.push([record.get("r"), record.get("n"), record.get("b")]))

      this.setState({
        data
      });

      session.close()
      driver.close()
    }).catch(e => {
      console.log(e)
      session.close();
    });

};

qmelpv7a

qmelpv7a1#

我不熟悉neo4j,但很明显getData(id)从服务器获取数据。这将是一个异步操作,所以您应该添加一个state属性,以便在获取数据时显示一个微调器。关于testdata不可用,我没有看到设置它的代码。也许您的setState代码应该是:

this.setState({
    testdata: data
  });
//If your data prop is testdata.

根据当前的setState,组件状态的data属性将使用服务器响应进行设置。

更新内容:

异步服务器调用的临时修复:您可以更改以下方法并尝试是否可以解决您的问题:

this.map.on('click', 'unclustered-point', async (e) => {
       // ...previous code

            await this.props.getData(id);
            // This forces the following code to execute synchronously. Basically it should wait for your API call to be complete

            new mapboxgl.Popup()
                .setLngLat(coordinates)
                .setHTML(
                    `
                    Id: ${id}
                        <br>
                     Infos: ${infos}
                        <br>
                        <br>
                     Testdata: ${this.props.testdata}
                    `
                )
                .addTo(this.map);
        });

        this.map.on('mouseenter', 'clusters', () => {
            this.map.getCanvas().style.cursor = 'pointer';
        });
        this.map.on('mouseleave', 'clusters', () => {
            this.map.getCanvas().style.cursor = '';
        });
    });

getData = (id) => {
//... previous code

// we return a promise to use await in the onClick handler
return session
    .run('Here goes a neo4j cypher statment',{id: id})
    .then((results)=> {

      const data= [];
      results.records.forEach((record) => data.push([record.get("r"), record.get("n"), record.get("b")]))

      this.setState({
        data
      });

      session.close()
      driver.close()
    }).catch(e => {
      console.log(e)
      session.close();
    });
}

如果您仍然遇到问题,请创建一个示例应用程序并与他人分享。

dw1jzc5e

dw1jzc5e2#

我还没有设法解决原来的问题。
不过,我找到了另一个解决办法:
在我的Map.js中,我在UI中调用this.props.testdata,如下所示:

<div className="sidebar">
   info: {JSON.stringify(this.props.testdata)}
 </div>

相关问题