【问题标题】:Rendering iframe into React将 iframe 渲染到 React
【发布时间】:2018-05-22 02:26:14
【问题描述】:

我有以下组件:

export default class VideoArchiveContent extends React.Component {
  constructor() {
    super();
    this.state = {
      videos: []
    }
  } 
  componentDidMount() {
    this.VideosTracker = Tracker.autorun(() => {
      Meteor.subscribe('videos');
      const videos = Videos.find().fetch();
      this.setState({ videos })
    });
  };
  componentWillUnmount() {
    this.VideosTracker.stop();
  };
  renderVideos = () => {
    return this.state.videos.map((video) => {
      return <div key={video._id}>{video.embed}</div>
    });
  };
  render() {
    return (
      <div>
        {this.renderVideos()}
      </div>
    )
  }
};

我希望 iframe 呈现到屏幕上。渲染的是 iframe 字符串。

如果我像这样将 iframe 放在 return 语句中:

return (
  <div>
    <iframe src="https://player.vimeo.com/video/270962511" width="500" height="281" frameborder="0" allowfullscreen></iframe>
  </div>
)

iframe 按预期呈现。

有解决办法吗?

【问题讨论】:

  • 什么是video.embed,第一个代码块中的iframe在哪里?
  • 您尝试过使用门户网站吗? devdocs.io/react/portals
  • @Sagiv video.embed 是 iframe=。 iframe 位于 Mongo 数据库中。它遍历每个 iframe 代码。
  • 您应该提供更好的上下文。显示输出和错误有助于调试代码。首先,您要显示的 iframe 没有 src。其次,我发现这对我很有用video-react.js.org

标签: reactjs meteor


【解决方案1】:

我不确定iframe 来自哪里,因为我在您的代码中没有看到它作为HTML 标记,所以我猜它来自服务器作为字符串。大概在video.embed.
里面 如果是这种情况,那么您需要使用 dangerouslySetInnerHTML 属性来呈现:

return <div key={video._id} dangerouslySetInnerHTML={{__html:video.embed}} />

谨慎使用它,我建议先在DOCS 中阅读它。

运行示例:

const tweetersIframe = '<iframe src="https://platform.twitter.com/widgets/tweet_button.html" />'
const App = () => (
  <div dangerouslySetInnerHTML={{ __html: tweetersIframe}}>
  </div>
);

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

【讨论】:

  • 谢谢。这确实解决了这个问题。考虑到危险,我想知道这是否是渲染 iframe 的唯一解决方案。
  • 我认为更好的选择是从服务器获取 url 并自己呈现iframe,而不是接收 html 作为字符串。没有其他方法可以将 html 标签呈现为字符串
  • 这是有道理的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 2017-10-24
  • 2015-11-03
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多