gpt4 book ai didi

javascript - React 组件中的 Async Meteor.call

转载 作者:行者123 更新时间:2023-11-30 12:02:04 26 4
gpt4 key购买 nike

我有一个 React 组件,其中包含一个 google-maps 实例。我将 Meteor 用于基础设施,问题是 React 组件正在同步呈现,但要获取服务器端变量,我必须求助于异步。如何恰本地处理这种情况?下面是我的代码片段:

import { Meteor } from 'meteor/meteor';
import React from 'react';
import { Gmaps, Marker, InfoWindow, Circle } from 'react-gmaps';

// Goals for this:
// - get the location of the user dynamically
// - see other users as markers

const coords = {
lat: 51.5258541,
lng: -0.08040660000006028,
};

export default class App extends React.Component {
componentWillMount() {
const params = {
v: '3.exp',
key: null,
};

Meteor.call('googleMapsApiKey', (err, res) => {
if (!err) {
params.key = res;
console.log('params', params);
}
});
}

onMapCreated(map) {
map.setOptions({
disableDefaultUI: true,
});
}

onDragEnd(e) {
console.log('onDragEnd', e);
}

onCloseClick() {
console.log('onCloseClick');
}

onClick(e) {
console.log('onClick', e);
}

onDragStart(e) {
console.log('onDragStart', e);
}

render() {
return (
<Gmaps
width={'800px'}
height={'600px'}
lat={coords.lat}
lng={coords.lng}
zoom={12}
loadingMessage={'Be happy'}
params={params}
onMapCreated={this.onMapCreated}
>
<Marker
lat={coords.lat}
lng={coords.lng}
draggable
onDragStart={this.onDragStart}
/>
<InfoWindow
lat={coords.lat}
lng={coords.lng}
content={'Hello, React :)'}
onCloseClick={this.onCloseClick}
/>
<Circle
lat={coords.lat}
lng={coords.lng}
radius={500}
onClick={this.onClick}
/>
</Gmaps>
);
}
}

这是显示同步/异步问题的告密控制台错误:

enter image description here

render 方法似乎不等待异步响应发生。解决此问题的最佳做法是什么?

最佳答案

当你设计一个 React 组件时,你应该考虑它可能有的多种状态。例如,您的 Google map 组件必须在显示 map 之前加载,因此它有两种状态:loading 和 loaded。这取决于您的 Meteor 调用的结果 key :

export default class App extends React.Component {

constructor(props) {
super(props);

this.state = {
v: '3.exp',
key: null
};

Meteor.call('googleMapsApiKey', (err, res) => {
if (!err) {
this.setState({ key: res })
}
});
}

...

render() {
if (this.state.key) {
return (
<Gmaps
width={'800px'}
height={'600px'}
lat={coords.lat}
lng={coords.lng}
zoom={12}
loadingMessage={'Be happy'}
params={this.state}
onMapCreated={this.onMapCreated}
>
<Marker
lat={coords.lat}
lng={coords.lng}
draggable
onDragStart={this.onDragStart}
/>
<InfoWindow
lat={coords.lat}
lng={coords.lng}
content={'Hello, React :)'}
onCloseClick={this.onCloseClick}
/>
<Circle
lat={coords.lat}
lng={coords.lng}
radius={500}
onClick={this.onClick}
/>
</Gmaps>
);
} else {
return <div>Loading...</div>;
}
}
}

基本上,我只是用一个状态替换了你的 const params 并添加了一些加载管理。请注意,在 ES6 组件中,您必须在构造函数中声明 this.state

关于javascript - React 组件中的 Async Meteor.call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36412629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com