Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor和React-组件安装、多个Meteor.calls和设置状态_Javascript_Reactjs_Meteor_Setstate - Fatal编程技术网

Javascript Meteor和React-组件安装、多个Meteor.calls和设置状态

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 (

我正试图通过meteor调用获取特定的用户详细信息(出于安全原因,需要在服务器端获取它们),并将结果设置为状态。我现在尝试的是:

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。