【问题标题】:Meteor and React - Componentdidmount, multiple Meteor.calls and setstateMeteor 和 React - Componentdidmount,多个 Meteor.calls 和 setstate
【发布时间】:2018-01-18 18:16:35
【问题描述】:

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

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,
    });
}

但在尝试此操作时,我收到控制台错误消息:

警告:只能更新已安装或已安装的组件。这通常 表示您在一个 未安装的组件。这是无操作的。

一切正常,但它正在向浏览器控制台发送我不想要的错误消息。什么是让这项工作以正确方式工作的正确方法?

【问题讨论】:

  • 如果这些数据是关于用户的,假设来自一个集合,那么有理由不对出版物这样做吗?
  • @user7386177 不,它不是来自集合。使用流星方法 (HTTP.call()) 从外部 API 获取数据。然后返回此数据并用于设置状态以供在应用程序中进一步使用。
  • 我使用与您相同的方法来处理类似的事情,但使用条件渲染函数,因为子组件也依赖于该数据。你也在用这样的东西吗?

标签: javascript reactjs meteor setstate


【解决方案1】:

这可能在卸载组件后解决回调时发生。为了避免这种行为,您必须跟踪您的组件是否仍然挂载。这可以通过在挂载时将标志设置为true,然后在卸载时设置false 来完成。 More info here.

【讨论】:

  • 我阅读了这篇文章,但我不确定为什么在此过程中会卸载组件。我读过 setState() 会导致重新渲染,但是如果在 ComponentdidMount() 中只使用了一个 setState(),这已经导致了这个错误。
  • @Maikey 重新渲染并不意味着它会被卸载;当组件已从虚拟 dom 中删除时,会发生卸载。最简单的调试方法是在 componentWillUnmount 中设置调试器
  • 我搞定了。谢谢!我忽略了一个事实,即我正在检查用户是否已登录,如果没有,则 this.props.history 设置为登录页面。这就是它实际出错的地方。为了解决这个问题,我创建了一个状态 isMounted 并给它一个初始值 false。如果用户登录,则设置为 true。在 ComponentdidMount 中,只有在 isMounted 的值为 true 时才会执行 Meteor.call
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2021-05-12
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多