我尝试创建一个可交互的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();
});
};
2条答案
按热度按时间qmelpv7a1#
我不熟悉neo4j,但很明显getData(id)从服务器获取数据。这将是一个异步操作,所以您应该添加一个state属性,以便在获取数据时显示一个微调器。关于testdata不可用,我没有看到设置它的代码。也许您的setState代码应该是:
根据当前的setState,组件状态的data属性将使用服务器响应进行设置。
更新内容:
异步服务器调用的临时修复:您可以更改以下方法并尝试是否可以解决您的问题:
如果您仍然遇到问题,请创建一个示例应用程序并与他人分享。
dw1jzc5e2#
我还没有设法解决原来的问题。
不过,我找到了另一个解决办法:
在我的Map.js中,我在UI中调用this.props.testdata,如下所示: