繁体   English   中英

如何将 Twitter 插件嵌入到 Reactjs?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM