2

我正在尝试实现 react-ga 但仅在生产服务器中(我有本地/开发和生产服务器)。

所以,我想在后台创建一个文本字段,该字段的值保存在数据库中。

然后在前端,只有当我在数据库中有值时才初始化 react-ga。

为了实现这一点,我正在尝试componentDidUpdateApp.jsx.

我通过以下方式在后台检索我的所有数据集:

componentDidMount() {
    // I get my data in this.props.data_admin
    this.props.list_admin();
}

然后在componentDidUpdate(prevProps, prevState)我检查 this.props.data_admin 是否设置并且不为空,当我得到值时,我想初始化 react-ga :

componentDidUpdate(prevProps, prevState, snapshot) {
    if (this.props.data_admin) {
        // this.props.data_admin.trackingNumber = UA-XXXXXXXXX
        ReactGA.initialize(this.props.data_admin.trackingNumber);
    }
}

但这会做很多次(每次更新 App.jsx 时)。所以我应该在初始化之前检查它是否已经完成。如何检查 react-ga 是否已经初始化?

谢谢你的帮助

4

3 回答 3

1

我认为您不应该这样做,componentDidUpdate而是在componentDidMount您检索数据之后。

您的数据检索过程是对后端/数据库的异步调用,它应该返回一个用检索到的数据解析的 Promise。然后你可以初始化 react-ga。

componentDidMount() {
    // I am assuming this.props.list_admin() returns your data
    this.props.list_admin().then((data_admin) => {
      if (data_admin) {
        // data_admin.trackingNumber = UA-XXXXXXXXX
        ReactGA.initialize(data_admin.trackingNumber);
      }
    });
}
于 2019-05-27T13:59:15.693 回答
0

最后我做了什么:

我调用this.props.list_admin();App.jsx构造函数,并创建了一个初始化为 false 的状态变量:

constructor(props) {
    super(props);

    this.state = {
        googleAnalyticsInitialized: false,
    };

    this.props.list_admin();
}

然后,在componentDidupdate我检查了值this.props.data_admin,如果googleAnalyticsInitialized是假的。如果是,我使用从 API 调用中收到的 ID 初始化 Google Analytics:

componentDidUpdate(prevProps, prevState, snapshot) {
    if (this.props.data_admin && this.props.data_admin.idGoogleAnalytics && !this.state.googleAnalyticsInitialized) {
        ReactGA.initialize(this.props.data_admin.idGoogleAnalytics);
        this.setState({googleAnalyticsInitialized: true});
    }
}

感谢@Chukwuemeka Onyenezido 帮助我并指导我正确的方式。

于 2019-05-29T12:46:46.173 回答
0

我希望找到比这更好的答案,但我只是做了

try {
    console.log(theObject);
} catch(e) {}

不是很优雅,有点脏,我想更多地了解发生了什么,但这有效。

返回故事

我正在尝试在减速器中访问商店并从中导入商店对象index.js是我当前的“解决方案”

于 2019-09-01T17:25:57.430 回答