我正在尝试用reactjs实现GTM。我使用过react-google-tag-manager,但它没有解决目的。 不知何故,数据层需要采用特定的格式,并且需要位于标签的正下方,但这只是我一次可以实现的其中之一。 我尝试将代码直接放在 template.html 中并从我想要的组件中调用该函数,但这不起作用。
import React from 'react';
import gtmParts from 'react-google-tag-manager';
class GoogleTagManager extends React.Component {
componentDidMount() {
const dataLayerName = this.props.dataLayerName || 'dataLayer';
const scriptId = this.props.scriptId || 'react-google-tag-manager-gtm';
if (!window[dataLayerName]) {
const gtmScriptNode = document.getElementById(scriptId);
eval(gtmScriptNode.textContent);
}
}
render() {
const gtm = gtmParts({
id: this.props.gtmId,
sourcegroup: this.props.gtmGroupname,
sourceid:this.props.gtmSource,
age:this.props.age,
mtongue:this.props.gtmMtongue,
city:this.props.city,
});
return (
<div>
<div>{gtm.noScriptAsReact()}</div>
<div id={this.props.scriptId || 'react-google-tag-manager-gtm'}>
{gtm.scriptAsReact()}
</div>
</div>
);
}
}
export default GoogleTagManager;
我正在 DataLayer 中推送参数并检查 google tag Assistant 插件,整个 datalyer 是空的。
我昨天遇到了这个问题,为了解决它,我必须将我尝试记录的所有属性放在
additionalEvents
属性下。像这样的东西:
const gtm = gtmParts({
id: this.props.gtmId,
additionalEvents: {
sourcegroup: this.props.gtmGroupname,
sourceid:this.props.gtmSource,
age:this.props.age,
mtongue:this.props.gtmMtongue,
city:this.props.city
}
})
并且还要避免使用
eval()
,因为这是一个危险的惯例。像这样更新您的代码:
if (!window[dataLayerName]) {
const script = document.createElement("script")
const gtmScriptNode = document.getElementById(scriptId)
const scriptText = document.createTextNode(gtmScriptNode.textContent)
script.appendChild(scriptText)
document.head.appendChild(script)
}
这是在 React 中实现 GTM 的快速简便的方法:
将以下代码添加到 public/index.html 文件中的
<head>
标签中:
<script nonce="**your-nonce-here**">
var gtmId = '**your-gtm-id-here**';
(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', `${gtmId}`);
</script>