React + Router + Google Tag Manager

25

我花了一些时间在quickcypher.com上开发MVP。我想开始加入一些分析功能,对于跟踪总访问量来说非常好用,但是当我尝试跟踪使用React Router的站点的不同URL时,事情就变得有些复杂了。

我的做法是:设置一个GA标签,在某些页面上触发自定义的“pageview”事件。当事件被触发时,我会将页面字段设置为“/rap”等。我在每个视图的顶级组件的“componentDidMount”方法中触发该事件。使用调试器,我看到事件按预期触发,但是我无法使GA确认该事件。当我简化标签以在“所有页面”上触发时,GA按预期工作,因此我认为问题与React有关。

有人成功实现过这个功能或者遇到类似的问题吗?我的方法错了吗?希望能得到一些指导……谢谢!

2个回答

82
有点晚了,但是React Router不需要特殊代码来与GTM集成。只需在页面上放置GTM脚本(建议在开头的<body>标签之后立即放置),然后让您的应用程序正常运行即可。在GTM中创建一个自定义触发器以进行历史更改。

GTM Trigger Example

您可以在所有历史更改上触发它。

all history changes

或者只在其中一些上。例如,只在您的生产主机上。

only on production

然后添加一个标签用于您的Google Analytics(或其他)并将其配置为在历史记录更改事件上触发,方法是单击“更多”下的“触发器”,然后选择上面创建的触发器。

GA Example

同样重要的是,我们需要更改标签的高级设置,使其每个事件只触发一次,而不是每个页面触发一次。如果没有这样做,标签将仅在初始页面加载时触发。

once per event


这应该是被接受的答案。简单而且有效。如果你想要一个包含事件等复杂内容的例子,那就是完全不同的故事了。 - kjonsson
@doublecheeseburger,你也可以把所有的事件都放在GTM中,但是这样可能会变得很混乱。 - chrisguitarguy
@chrisguitarguy 在更改历史记录时,React 会向服务器发送请求(ajax),并在从服务器返回结果后更新页面。但在此之前,历史更改事件会触发并执行标签代码。我们如何处理这种情况并等待 React 更新页面? - Waqas Malik
1
@WaqasMalik 我建议使用GTM数据层(只是一个全局数组),并推送自定义事件,以便在GTM中监听触发GA(或任何其他标签)。 - chrisguitarguy
4
这似乎不会在页面加载时触发。我认为需要同时启用所有页面和历史更改选项。 - Gabriel R.

7
这可能是由于您的Google Analytics帐户配置不正确导致的,但假设您可以将初始页面视图事件发送回GA,这里有一份配方可以利用react-router的willTransitionTo钩子。它还使用了react-google-analytics。首先执行npm install react-google-analytics
然后像这样配置您的应用程序:
var React = require('react');
var Router = require('react-router');
var Route = Router.Route;
var DefaultRoute = Router.DefaultRoute;
var RouteHandler = Router.RouteHandler;
var ga = require('react-google-analytics');
var GAInitiailizer = ga.Initializer;

// some components mapped to routes
var Home = require('./Home');
var Cypher = require('./Cypher');

var App = React.createClass({
  mixins: [Router.State],
  statics: {
    willTransitionTo: function(transition, params, query, props) {
      // log the route transition to google analytics
      ga('send', 'pageview', {'page': transition.path});
    }
  },
  componentDidMount: function() {
    var GA_TRACKING_CODE = 'UA-xxxxx';
    ga('create', GA_TRACKING_CODE);
    ga('send', 'pageview');
  },
  render: function() {
    return (
      <div>
        <RouteHandler />
        <GAInitiailizer />
      </div>
    );
  }
});

var routes = (
  <Route path="/" handler={App} >
    <DefaultRoute handler={Home} />
    <Route name="cypher" path="/cypher" handler={Cypher} />
  </Route>
);

Router.run(routes, function (Handler) {
  React.render(<Handler />, document.body);
});

module.exports = App;

我好像无法使它工作。Router上没有“run”方法。我正在使用ReactRouter,这也应该是你的情况。这个方法被弃用了吗? - Sachin Jain
是的。React Router在React Router 1.0.0版本中已经弃用了.run!请参考https://github.com/reactjs/react-router/blob/master/upgrade-guides/v1.0.0.md。 - Edoardo L'Astorina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接