[英]How to embed Twitter widget to Reactjs?
转到 twitter 小部件站点 ( https://publish.twitter.com/ ),我可以将一个小部件添加到我的站点。 我正在使用示例代码来尝试了解它的工作原理:
<a class="twitter-grid" href="https://twitter.com/TwitterDev/timelines/539487832448843776">National Park Tweets</a> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
如果我只是将它添加到 HTML 页面,那么代码就可以正常工作。 它显示了带有相应推文的网格。
但是,当将其添加到 ReactJS 时,我看到的只是后备代码,它仅提供指向 twitter 用户名的链接。
我尝试使用以下无济于事:
<div dangerouslySetInnerHTML={{__html: "<a className='twitter-grid' href='https://twitter.com/TwitterDev/timelines/539487832448843776'>National Park Tweets</a> <script async src='https://platform.twitter.com/widgets.js' charset='utf-8'></script>"}}>
</div>
查看这个 npm 包: react-twitter-widgets 。 这似乎正在完成您需要的开箱即用的功能。
import { Tweet } from 'react-twitter-widgets'
ReactDOM.render(<Tweet tweetId='511181794914627584'/>, document.getElementById('root'))
我不知道其他人是否仍然有这个问题,但在我的情况下,我从 API 获取文章正文内容,只是将该 html 插入到 div 中,但无法使推文正常工作。
只是想出了一个解决方案,所以我的 index.html 中有小部件 js。
然后在组件更新时,我检查我的文章内容是否已加载,然后只需调用twttr.widgets.load()
这是我的 componentDidUpdate 函数:
componentDidUpdate(props) {
if(this.props.article.status === 'FULFILLED' && this.props.article.status !== props.article.status) {
twttr.widgets.load(
document.getElementById('article')
)
}
}
希望其他人觉得这很有用!
在添加样式之前,我在使用 twttr.widgets.load() 方法显示推文文本时遇到了问题。 这就是我使用 twttr.widgets.createTweet() 方法并添加加载 state 解决该问题的方法。
(还使用 TypeScript 和 Tailwind CSS - 根据需要随意删除它。)
将脚本添加到 index.html 中的内部主体:
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</body>
创建推文组件:
import { useEffect, useState } from "react";
export default function Tweet({
tweetID,
}: TweetProps) {
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
if ((window as any).twttr) {
(window as any).twttr.widgets.createTweet(
tweetID,
document.getElementById(tweetID),
{
align: 'center',
conversation: 'none',
dnt: true,
theme: 'dark',
}
).then(() => setIsLoading(false));
};
}, [tweetID]);
return (
<div className="w-full animate-fadeIn" id={tweetID}>
{isLoading && <p>LOADING</p>}
</div>
);
};
interface TweetProps {
tweetID: string,
};
// twttr.widgets.createTweet:
// https://developer.twitter.com/en/docs/twitter-for-websites/embedded-tweets/guides/embedded-tweet-javascript-factory-function
// Embedded Tweet parameter reference
// https://developer.twitter.com/en/docs/twitter-for-websites/embedded-tweets/guides/embedded-tweet-parameter-reference
用法:
<Tweet tweetID="1002103497725173760" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.