【问题标题】:Add javascript object on componentDidMount in rendered html在呈现的 html 中的 componentDidMount 上添加 javascript 对象
【发布时间】:2017-05-10 12:11:27
【问题描述】:

我想在组件挂载时将 javascript 对象添加到模板中以进行跟踪。对象需要像这样渲染出来:

var tracking = {
        pagename: 'page name',
        channel: 'lp',
        subSection1: 'section',
        pageidentifier: 'identifier'
      }

我在 componentDidMount 函数中设置了一个状态对象,但我似乎无法让该对象出现在页面上。

以下是我在渲染函数中调用的内容:

<script>{`
      var dataLayer = ${this.state.tracking}
    `}</script>

这会返回 [object,object] 但我需要它来写出对象。

我该怎么做呢?我找不到任何这样做的例子,这似乎是一件很简单的事情,但无法弄清楚

【问题讨论】:

  • 如果这是一个全局的var,为什么不把它附加到窗口上呢? window.dataLayer = ...

标签: javascript reactjs tracking


【解决方案1】:

添加script 标签的一种方法是:

componentWillMount() {
        const script = document.createElement("script");
        script.text= this.state.tracking;    
        document.body.appendChild(script);
}

虽然这个object是全局的,为什么不直接把它贴在窗口上呢?
window.dataLayer = this.state.tracking;

【讨论】:

  • 我仍然得到 [object, object] 输出
  • 嗯,这确实是一个对象。你到底想做什么?
  • 我想将 var tracking = { 'key': value, 'key': value } 完全一样地写到页面上以进行跟踪
  • 对不起,我不明白你到底想做什么
  • 我有一个跟踪对象(dataLayer),当我更改跟踪页面时需要更改该对象以获取哪个页面。在当前这个时间点,这个答案不起作用,因为跟踪没有拾取对象,并且还有一个 js 错误 - SyntaxError: Unexpected identifier but the js you provided is fine
【解决方案2】:

如果您希望与 React 范围之外的跟踪函数进行交互,您还可以使用全局函数。在你的 index.html 中:

<script>
  document.MyTrackingFunc = function (data) {
    console.log(data);
  }
</script>

在你的 componentDidMount 函数中:

document.MyTrackingFunc(someData);

【讨论】:

  • 如果我不先加载主页而只是在内部页面上重新加载,我得到 MyTrackingFunc 不是一个函数
猜你喜欢
  • 2018-05-27
  • 1970-01-01
  • 2023-03-16
  • 2017-03-09
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多