Как интегрировать виджет Twitter в Reactjs?
Я хочу добавить виджет Twitter в React, но я не знаю, с чего начать и как это сделать. Я очень новичок в React JS.
Вот HTML-версия кода:
<div class="Twitter">
<a class="twitter-timeline" href="https://twitter.com/<%= @artist.twitter %>" 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: ...
]
Я планировал добавить скрипт, где точки (...), но это не работает. Спасибо за помощь.
10 ответов
Сначала загрузите Widget JS в ваш index.html(перед вашими скриптами React). Затем в вашем компоненте просто сделайте следующее. Виджет JS будет повторно сканировать DOM.
componentDidMount: function() {
twttr.widgets.load()
}
Смотрите: https://dev.twitter.com/web/javascript/initialization
Это работает для меня!
Обратите внимание, что я использую 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 Component (который использует кнопку 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>
);
Кажется, гораздо проще использовать 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>
Более подробная информация о настройке библиотеки находится здесь.
Это просто, все, что вам нужно, просто использовать React's componentDidMount
крюк
{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"
Попробуйте установить response-twitter-embed, выполнивnpm install react-twitter-embed
. После установки пользоваться довольно просто. Взгляните на скриншот ниже.
Пример кода:
import React from 'react';
import { TwitterTimelineEmbed } from 'react-twitter-embed';
const TwitterTimeLine = () => {
return (
<TwitterTimelineEmbed
sourceType="profile"
screenName="accimeesterlin" // change to your username
options={{height: 1200}}
/>
);
}
export default TwitterTimeLine;
У них также есть список других компонентов, которые вы также можете использовать.
Список доступных компонентов
- TwitterShareButton
- TwitterFollowButton
- TwitterHashtagButton
- TwitterMentionButton
- TwitterTweetEmbed
- Twitter МоментПоделиться
- TwitterDMButton
- TwitterVideoEmbed
- TwitterOnAirButton
Вот ссылка на пакет npm https://www.npmjs.com/package/react-twitter-embed
Вы можете использовать этот React Social Embed Component.
Отказ от ответственности: это компонент, созданный мной.
Установить с помощью: npm i react-social-embed
,
Использование:
import TweetEmbed from 'react-social-embed'
<TweetEmbed id='789107094247051264' />
/>
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');
}
ИМХО, ты должен разделить его на две части. Часть вашего кода может быть каким-то образом визуализирована в компоненте 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');
Ваш тег сценария может быть размещен как отдельный компонент React или как обычный HTML прямо над закрывающим тегом тела.
Есть несколько интересных решений, но все они вводят код твитеров на сайт.
Что бы я предложил, это создать еще один пустой HTML-файл только для этого виджета. Например. /twitter.html
где вы можете разместить все грязные скрипты Java и визуализировать виджет.
Тогда, когда вы включаете:
<iframe src="/twitter.html" />
Это будет работать без проблем. Кроме того, вы разделили внешние скрипты - так что это хорошо для безопасности.
Просто добавьте немного стиля, чтобы он выглядел хорошо:
twitter.html
html,
body {
margin: 0;
padding: 0;
}
Реагировать на iframe
iframe {
border: none;
height: ???px;
}
Я точно знаю, в чем проблема, для начала нужно понять, как работает React. React - это интерфейсный фреймворк, работает так, как будто вся DOM обрабатывается с помощью реакции, если мы напрямую интегрируемся с DOM, тогда иногда очень сложно кодировать, потому что React также обновляет эту DOM.
Согласно документации Twitter, мы не можем добавлять twitter.js после инициализации веб-страницы. https://dev.twitter.com/web/javascript/initialization
так что лучше использовать какой-нибудь пакет, response-twitter-embed
Простой шаг
npm install --save react-twitter-embed
import { TwitterTimelineEmbed } from 'react-twitter-embed';
<TwitterTimelineEmbed
sourceType="profile"
userId={"1029587508445630465"}
options={{height: 400}}
/>
Вы можете проверить интеграцию, отличную от временной шкалы, также с помощью package.
https://romik-mk.medium.com/embed-twitter-timeline-widgets-reactjs-a27cafd7cfb6