如何在 react js 中嵌入 google adsense

IT技术 javascript reactjs react-redux ads adsense
2021-03-30 08:14:41

我是 reactjs 的初学者,我想在循环中嵌入谷歌内嵌广告。广告仅在第一次展示。当我检查元素标签显示在循环中。我能知道如何解决这个问题吗?

Google Adsense 代码:-

 var ScheduleRow = React.createClass({
 var rows = _.map(scheduleData.schedules, function(scheduleList, i) {
  var divStyle = { display: "block"};  
  return (  
    <ins className="adsbygoogle"
        style={divStyle}
        data-ad-client="ca-pub-3199660652950290"
        data-ad-slot="6259591966"
        data-ad-format="auto" key={i}>
    </ins>
  ); 
 });

return (
    <span>
        {rows}
    </span>
);
});

输出:-

输出图像

检查元素输出:-

检查元素输出

3个回答

这似乎是一个重复的问题。你可以在这里找到它但我认为这不是 100% 清楚。所以,我在这篇博客文章中遇到过一次,它更清楚。

从谷歌你有这个:

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
</script>

<ins class="adsbygoogle"
      style="display:block"
      data-ad-client="ca-pub-12121212"
      data-ad-slot="12121212"
      data-ad-format="auto"/>

<script>
  (adsbygoogle = window.adsbygoogle || []).push({});
</script>

现在,在您的 React 应用程序中:

在 index.html 中包含以下代码段

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

创建你的react组件,如:

import React from 'react';

export default class AdComponent extends React.Component {
  componentDidMount () {
    (window.adsbygoogle = window.adsbygoogle || []).push({});
  }

render () {
    return (
        <ins className='adsbygoogle'
          style={{ display: 'block' }}
          data-ad-client='ca-pub-12121212'
          data-ad-slot='12121212'
          data-ad-format='auto' />
    );
  }
}

现在,要多次渲染它,您可以简单地ins用像map. 但是,我不完全理解您在这里的需求。

如果你想一次显示它们,那么像这样做你的地图

如果您想随机化您的广告,请为您的组件添加一个状态和一个勾选状态,以便它可以每 X 秒重新渲染一次。这个SO 答案中检查它

笔记:

  1. 从您的 google 意义上添加,将class属性重命名className
  2. 更新style属性以这样包装:style={{ display: 'block' }}
我想循环显示广告,但它只显示第一行
2021-06-12 08:14:41
抱歉回复晚了,我最近两周感觉不舒服,今天我会实施
2021-06-14 08:14:41
我也在做同样的事情。我仍然没有看到广告。我为广告创建了一个新组件并将其导入到我的 Home.jsx 文件中。当我检查时,在 cosole 选项卡中显示错误:`无法加载资源:ads.js`
2021-06-18 08:14:41

@jpgbarbosa 的回答很棒。我将为具有多个页面的服务器端渲染 React 应用程序添加更好的实践,为了可扩展性,我建议您使用这种方法来保持代码库的可维护性。

export default class HomePage extends React.Component {
  componentDidMount() {
    const installGoogleAds = () => {
      const elem = document.createElement("script");
      elem.src =
        "//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js";
      elem.async = true;
      elem.defer = true;
      document.body.insertBefore(elem, document.body.firstChild);
    };
    installGoogleAds();
    (adsbygoogle = window.adsbygoogle || []).push({});
  }

  render() {
    return (
      <ins className='adsbygoogle'
           style={{ display: 'block' }}
           data-ad-client='ca-pub-12121212'
           data-ad-slot='12121212'
           data-ad-format='auto' />
    );
  }
}
@Foo 我从来没能做到这一点,所以我最后还是没有,对不起
2021-05-29 08:14:41
@AT92 你解决了吗?如果是这样,您可以分享解决方案吗?
2021-06-01 08:14:41
可能检查谷歌广告库是否更新?我建议检查cdn链接
2021-06-02 08:14:41
嗨,我想,因为它好像做比添加脚本index.html文件的一个更好的方式来使用此代码,但我得到这个错误:'adsbygoogle' is not defined no-undef有任何想法吗?
2021-06-04 08:14:41
@Foo 不,不需要。
2021-06-14 08:14:41

如果您在一个组件中加载了 Adsense 脚本并将其投放到另一个组件中,则在安装第二个组件时该脚本可能尚未加载。因此,window.adsbygoogle将被评估为 [] 并且不会加载广告。如果您同时使用自动广告和广告单元,这甚至会影响自动广告。

这是我实施的解决方案:

import React, { useEffect } from "react"

const SideAd = () => {
  useEffect(() => {
    const pushAd = () => {
      try {
        const adsbygoogle = window.adsbygoogle
        console.log({ adsbygoogle })
        adsbygoogle.push({})
      } catch (e) {
        console.error(e)
      }
    }

    let interval = setInterval(() => {
      // Check if Adsense script is loaded every 300ms
      if (window.adsbygoogle) {
        pushAd()
        // clear the interval once the ad is pushed so that function isn't called indefinitely
        clearInterval(interval)
      }
    }, 300)

    return () => {
      clearInterval(interval)
    }
  }, [])
  return (
    <ins
      className="adsbygoogle"
      style={{ display: "inline-block", width: "300px", height: "250px" }}
      data-ad-client="ca-pub-xxxxxx"
      data-ad-slot="xxxxx"
    ></ins>
  )
}

export default SideAd