Javascript Meteor和React-组件安装、多个Meteor.calls和设置状态
我正试图通过meteor调用获取特定的用户详细信息(出于安全原因,需要在服务器端获取它们),并将结果设置为状态。我现在尝试的是:Javascript Meteor和React-组件安装、多个Meteor.calls和设置状态,javascript,reactjs,meteor,setstate,Javascript,Reactjs,Meteor,Setstate,我正试图通过meteor调用获取特定的用户详细信息(出于安全原因,需要在服务器端获取它们),并将结果设置为状态。我现在尝试的是: componentDidMount(){ Meteor.call('getCurrentCF', this.state.currentAccount, (err, res) => { if (!err) { var result = JSON.parse(res.content); if (
componentDidMount(){
Meteor.call('getCurrentCF', this.state.currentAccount, (err, res) => {
if (!err) {
var result = JSON.parse(res.content);
if (typeof result.cfu['destinations'] != 'undefined') {
if(result.cfu['destinations'][0].destination === "voicebox") {
this.setState({
cfActive: 'btn btn-block btn-maik',
vbActive: 'btn btn-block btn-maik-active',
});
} else {
this.setState({
cfActive: 'btn btn-block btn-maik-active',
vbActive: 'btn btn-block btn-maik',
currentCFDest: "(" + result.cfu['destinations'][0].simple_destination + ")",
});
}
} else {
this.setState({
cfActive: 'btn btn-block btn-maik',
vbActive: 'btn btn-block btn-maik',
});
}
} else {
console.log("Error: " + err);
}
});
Meteor.call('getCurrentVM', this.state.currentAccount, (err, res) => {
if(!err) {
var vms = JSON.parse(res.content);
this.setState({
vmCount: vms.total_count,
});
} else {
console.log(err)
}
});
this.setState({
isLoading: false,
});
}
但在尝试此操作时,我得到一个控制台错误消息:
警告:只能更新已安装或正在安装的组件。这通常
意味着您在上调用了setState、replaceState或forceUpdate
未安装的组件。这是禁止的
这一切都是可行的,但它正在向浏览器控制台发送错误消息,这是我不希望看到的。正确的方法是什么?卸载组件后回调解析时,可能会发生这种情况。为了避免这种行为,您必须跟踪组件是否仍在安装。这可以通过在装载时将标志设置为
true
,然后在卸载时将标志设置为false
如果这些数据是关于用户的,假设这些数据来自于一个集合,那么有没有理由不使用出版物来这样做?@user7386177没有,它不是来自一个集合。使用meteor方法(HTTP.call())从外部API获取数据。然后返回这些数据,并用于设置状态,以便在应用程序中进一步使用。我使用的方法与您相同,但使用的是条件渲染函数,因为子组件也依赖于该数据。你也在使用这样的东西吗?我读了这篇文章,但我不确定为什么在这个过程中卸载组件。我已经读到setState()会导致重新加载,但是如果ComponentdidMount()中只使用了一个setState(),这已经导致了这个错误。@Maikey re render并不意味着它将被卸载;当组件从虚拟dom中移除时,会发生卸载。最简单的调试方法是在ComponentWillUnmount中设置调试器,使其正常工作。谢谢我忽略了这样一个事实:我正在检查用户是否登录,如果没有,则将this.props.history设置为登录页面。这就是问题所在。为了解决这个问题,我创建了一个状态isMounted,并给它一个初始值false。如果用户登录,则此设置为true。在ComponentdidMount中,只有isMounted的值为true时,才会执行Meteor.call。