Рендеринг iframe в React

У меня есть такой компонент:

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 в первом блоке кода?

Sagiv b.g 21.05.2018 20:20

Вы пробовали пользоваться порталами? devdocs.io/react/portals

manAbl 21.05.2018 20:25

@Sagiv video.embed - это iframe = <iframe src = ...> </iframe>. Iframe находится в базе данных Mongo. Он перебирает каждый код iframe.

flimflam57 21.05.2018 20:26

Вы должны предоставить лучший контекст. Отображение вывода, а также ошибок может помочь отладить код. Во-первых, для iframe, который вы пытаетесь отобразить, нет src. Во-вторых, мне это пригодилось video-react.js.org

Austin Efnor 21.05.2018 20:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
4
4
8 789
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, откуда взялся 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>

Спасибо. Это устранило проблему. Мне интересно, является ли это единственным решением для рендеринга фреймов с учетом опасности.

flimflam57 21.05.2018 20:35

Я думаю, что лучший вариант - получить URL-адрес с сервера и самостоятельно отобразить iframe вместо получения html в виде строки. Другого способа отображать HTML-теги в виде строк нет.

Sagiv b.g 21.05.2018 20:40

В этом есть смысл. Спасибо.

flimflam57 21.05.2018 20:48

Другие вопросы по теме