Как интегрировать виджет Twitter в Reactjs?

Я хочу добавить виджет Twitter в React, но я не знаю, с чего начать и как это сделать. Я очень новичок в React JS.

Вот HTML-версия кода:

<div class="Twitter">
  <a class="twitter-timeline" href="#" onclick="location.href='https://twitter.com/<%= @artist.twitter %>'; return false;" data-widget-id="424584924285239296" data-screen-name='<%= @artist.twitter %>'>Tweets by @<%= @artist.twitter %></a>
  <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
</div>

И вот что я до сих пор:

React.DOM.div
  className: 'Twitter'
  children: [
    React.DOM.a
      className: 'twitter-timeline'
      href: "https://twitter.com/" + artist.twitter
      'data-widget-id': "424584924285239296" 
      'data-screen-name': artist.twitter
      children: 'Tweets by ' + artist.twitter
    React.DOM.script
      children: ...
  ]

Я планировал добавить script, где находятся точки (...), но это не работает. Благодарим вас за помощь.

Ответ 1

Сначала загрузите Widget JS в свой index.html(перед вашими сценариями React). Затем в вашем компоненте просто выполните следующее. Виджет JS пересканирует DOM.

componentDidMount: function() {
  twttr.widgets.load()
}

Смотрите: https://dev.twitter.com/web/javascript/initialization

Ответ 2

Это работает для меня!

Обратите внимание, что я использую React v0.14 и ECMAScript 2015 (ака ES6) с Babel.

index.html(после тега body):

<script>window.twttr = (function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0],  t = window.twttr || {};
  if (d.getElementById(id)) return t;
  js = d.createElement(s); js.id = id;
  js.src = "https://platform.twitter.com/widgets.js";
  fjs.parentNode.insertBefore(js, fjs);
  t._e = []; t.ready = function(f) {
    t._e.push(f);
  };
  return t;
}(document, "script", "twitter-wjs"));
</script>

Компонент Twitter:

const Twitter = () => (
  <a href="https://twitter.com/your-twitter-page"
    className="twitter-follow-button"
    data-show-count="false"
    data-show-screen-name="false"
  >
  </a>
);

Некоторые элементы React (который использует кнопку Twitter):

class SomeReactComponent extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <div>
        <Twitter />
      </div>
    );
  }
}

Или, если вы хотите создать настраиваемую кнопку, вы можете просто сделать это:

const Twitter = () => (
  <a href="https://twitter.com/intent/tweet?via=twitterdev">
    <i className="zmdi zmdi-twitter zmdi-hc-2x"></i>
  </a>
);

Ответ 3

Это легко, все, что вам нужно, просто используйте React componentDidMount hook

{createClass, DOM:{a}} = require "react"

@TwitterWidget = createClass
  componentDidMount: ->
    link = do @refs.link.getDOMNode
    unless @initialized
      @initialized = yes
      js = document.createElement "script"
      js.id = "twitter-wjs"
      js.src = "//platform.twitter.com/widgets.js"
      link.parentNode.appendChild js

  render: ->
    {title, content, widget} = @props
    a
      ref: "link"
      className: "twitter-timeline"
      href: "https://twitter.com/#{widget.path}"
      "data-widget-id": widget.id,
      widget.title

TwitterWidget
  widget:
    id: "your-widget-id"
    title: "Your Twitts"
    path: "widget/path"

Ответ 4

Кажется, что гораздо проще использовать Twitter widgets.js, более конкретно createTimeline.

class TwitterTimeline extends Component {
  componentDidMount() {
    twttr.ready(() => {
      twttr.widgets.createTimeline(widgetId, this.refs.container)
    })
  }

  render() {
    return <div ref="container" />   
  }
}

Вы можете загрузить библиотеку непосредственно из https://platform.twitter.com/widgets.js, но они рекомендуют следующий фрагмент:

<script>window.twttr = (function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0],
    t = window.twttr || {};
  if (d.getElementById(id)) return t;
  js = d.createElement(s);
  js.id = id;
  js.src = "https://platform.twitter.com/widgets.js";
  fjs.parentNode.insertBefore(js, fjs);

  t._e = [];
  t.ready = function(f) {
    t._e.push(f);
  };

  return t;
}(document, "script", "twitter-wjs"));</script>

Дополнительная информация о настройке библиотеки здесь.

Ответ 5

Вы можете использовать этот React Social Embed Component.

Отказ от ответственности: это компонент, созданный мной.

Установить по: npm i react-social-embed.

Использование:

import TweetEmbed from 'react-social-embed'

<TweetEmbed id='789107094247051264' />
/>

Ответ 6

ИМХО, вы должны разделить его на две части. Часть вашего кода может быть каким-то образом представлена ​​в компоненте React

/**
 * @jsx React.DOM
 */
var React = require('react');
var twitterWidget = React.createClass({
    render: function () {
        return (
            <div class="Twitter">
                <a class="twitter-timeline" 
                   href={this.props.link} 
                   data-widget-id={this.props.widgetId} 
                   data-screen-name={this.props.screenName} > 

                   Tweets by {this.props.screenName}
                </a>
            </div>
        );
    }
});
React.renderComponent(<twitterWidget link="..." widgetId="..." />, document.getElementById('containerId');

Твой тег script можно разместить как отдельный компонент React или как обычный HTML чуть выше закрывающего тега body.

Ответ 7

class TwitterShareButton extends React.Component {
      render() {
        return <a href="https://twitter.com/share" className="twitter-share-button">Tweet</a>
      }

      componentDidMount() {
        // scriptタグが埋め込まれた後にTwitterのaタグが置かれても機能が有効にならないので、すでにscriptタグが存在する場合は消す。
        var scriptNode = document.getElementById('twitter-wjs')
        if (scriptNode) {
          scriptNode.parentNode.removeChild(scriptNode)
        }

        // ボタン機能の初期化(オフィシャルのボタン生成ページで生成されるものと同じもの)
        !function(d,s,id){
          var js,
              fjs=d.getElementsByTagName(s)[0],
              p=/^http:/.test(d.location)?'http':'https';
          if(!d.getElementById(id)){
            js=d.createElement(s);
            js.id=id;
            js.src=p+'://platform.twitter.com/widgets.js';
            fjs.parentNode.insertBefore(js,fjs);
          }
        }(document, 'script', 'twitter-wjs');
      }

http://qiita.com/h_demon/items/95e638666f6bd479b47b

Ответ 8

Есть несколько интересных решений, но все они вводят текст твиттера на веб-сайт.

Что я предлагаю - создать еще один пустой html файл только для этого виджета. Например. /twitter.html, где вы можете разместить все грязные JavaScripts и визуализировать виджет.

Затем, когда вы включаете:

<iframe src="/twitter.html" />

Он будет работать без каких-либо проблем. Кроме того, вы разделили внешние скрипты - так что это хорошо для безопасности.

Просто добавьте стиль, чтобы он выглядел нормально:

twitter.html

html,
body {
  margin: 0;
  padding: 0;
}

Реагировать iframe

iframe {
  border: none;
  height: ???px;
}