У меня есть такой компонент:
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 отображается должным образом.
Есть решение?
Вы пробовали пользоваться порталами? devdocs.io/react/portals
@Sagiv video.embed - это iframe = <iframe src = ...> </iframe>. Iframe находится в базе данных Mongo. Он перебирает каждый код iframe.
Вы должны предоставить лучший контекст. Отображение вывода, а также ошибок может помочь отладить код. Во-первых, для iframe, который вы пытаетесь отобразить, нет src. Во-вторых, мне это пригодилось video-react.js.org





Я не уверен, откуда взялся iframe, поскольку я не вижу его в вашем коде как тега HTML, поэтому я предполагаю, что он поступает с сервера в виде строки. Наверное внутри video.embed.
В этом случае вам нужно будет использовать атрибут dangerouslySetInnerHTML, чтобы отобразить это:
return <div key = {video._id} dangerouslySetInnerHTML = {{__html:video.embed}} />
Используйте его с осторожностью, я советую сначала прочитать об этом в ДОКУМЕНТЫ.
Пример выполнения:
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>Спасибо. Это устранило проблему. Мне интересно, является ли это единственным решением для рендеринга фреймов с учетом опасности.
Я думаю, что лучший вариант - получить URL-адрес с сервера и самостоятельно отобразить iframe вместо получения html в виде строки. Другого способа отображать HTML-теги в виде строк нет.
В этом есть смысл. Спасибо.
что такое
video.embedи где находитсяiframeв первом блоке кода?