使用 NextJs 的 GTM

Ale*_*lex 1 reactjs next.js

在 NextJs(启用 SSR)应用程序上注册路由更改事件时遇到问题。我在 GTM 中使用历史更改事件触发器。

使用react-gtm-module初始化 Google 标签管理器。

问题:事件在装载时触发,路线例如。www.site.com/product/123 但是当我从页面 /product/123/ 导航到像 /product/124/ 这样的页面时,事件不会触发。

产品页面:

return (
<div>
  <div>{props.title}</div>
  <Link href="/product/[pid]" as={`/product/124`}>
    <a>Another product (should trigger event here, but doesn't)</a>
  </Link>
</div>
)
Run Code Online (Sandbox Code Playgroud)

我曾尝试将此添加到 _app.js (componentDidMount)

     import Router from 'next/router';
      ...
      componentDidMount () {
      ...
      if (process.browser) {
      Router.onRouteChangeComplete = url => {
        window.history.pushState({}, document.title, url);
      };
    }
Run Code Online (Sandbox Code Playgroud)

在 NextJs 中这样做的正确方法是什么?

ElD*_*n90 5

您必须在每个页面上注入您的标签管理器脚本。由于 _document.js 是每个页面的包装器,因此您应该将 GTM 脚本添加到 _document.js 的 head 部分,如下所示:

<Head>
  <script dangerouslySetInnerHTML={{
    __html: `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  })(window,document,'script','dataLayer','GTM-*****');`,
  }}>
  </script>
  ...
</Head>
Run Code Online (Sandbox Code Playgroud)