Эта статья была рецензирована Крейгом Билнером . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!
В этом кратком совете мы собираемся создать компонент видео React. Это позволит вам определить список видео и позволить вашим посетителям переключаться между ними. Компонент будет поддерживать Vimeo, YouTube и Dailymotion, но вы можете легко расширить его для поддержки других поставщиков видео.
В качестве среды разработки мы будем использовать реактивную горячую котельную, которая включает горячую перезагрузку. Это означает, что мы можем построить наш компонент и сразу увидеть результаты в браузере, не обновляя страницу каждый раз, когда изменяется код.
Вы можете найти исходный код нашего репозитория GitHub , а также демонстрацию в нижней части статьи.
Начиная с Boilerplate
Мы начнем с настройки нашей рабочей среды, используя шаблон. Предполагая, что на вашей машине установлен git, давайте клонируем репозиторий, выполнив:
git clone https://github.com/gaearon/react-hot-boilerplate   Это создаст в папке, в которой мы находимся, папку react-hot-boilerplate .  Теперь перейдем к этой папке и установим зависимости, запустив: 
 cd react-hot-boilerplate npm install 
Далее нам нужно установить строку запроса, которую мы будем использовать позже.
 npm install --save query-string 
Наконец, мы можем начать с:
 npm start 
  Если все идет по плану, в приглашении появится сообщение Listening at localhost:3000 .  Веб-пакет все равно должен будет обработать файлы, прежде чем сможет их обслуживать.  После некоторой задержки в приглашении должна появиться последовательность операций, заканчивающаяся webpack: bundle is now VALID , что означает, что все готово к работе. 
Перейдя по адресу http: // localhost: 3000 / в браузере, вы сможете увидеть «Привет, мир». отображается.
Создание компонента
  Первое, что нужно сделать, это создать файл компонента в src/social-video.js .  На данный момент будет достаточно минимального кода, необходимого для работы компонента, и некоторого фиктивного содержимого рендеринга. 
 import React, {Component} from 'react'; export default class SocialVideo extends Component { render() { return ( <h1>Social Video</h1> ); } } 
  Далее, в src/App.js , давайте создадим список видео, которые мы можем циклически переключать между кнопками Next и Previous . 
 import React, { Component } from 'react'; import SocialVideo from './social-video'; var videos = [ { service: 'youtube', video: 'https://www.youtube.com/watch?v=XxVg_s8xAms' }, { service: 'vimeo', video: 'https://vimeo.com/151715092' }, { service: 'dailymotion', video: 'http://www.dailymotion.com/video/x3oc771_la-voiture-du-futur_tech' } ]; export default class App extends Component { constructor (props) { super(props); this.state = { videoIndex: 0 }; } goToVideo (index) { let videoIndex = index; if (videoIndex < 0) { videoIndex = videos.length - 1; } else if (videoIndex >= videos.length) { videoIndex = 0; } this.setState({ videoIndex }); } render() { const {service, video} = videos[this.state.videoIndex]; return ( <div> <SocialVideo service={service} video={video} width={500} height={270} /> <p> <span>{service}: </span> <span>{video}</span> </p> <button onClick={this.goToVideo.bind(this, this.state.videoIndex - 1)}> Previous </button> <button onClick={this.goToVideo.bind(this, this.state.videoIndex + 1)}> Next </button> </div> ); } } 
  Здесь нет ничего необычного.  Мы определяем массив с данными о видео, между которыми мы хотим переключиться.  В состоянии App мы сохраняем позицию в массиве, которая указывает, какое видео выбрано.  Мы также отображаем информацию о выбранном видео и отображаем наш компонент SocialVideo .  На данный момент компонент не делает много, поэтому мы должны добраться до него. 
  Мы будем передавать видеоинформацию в качестве props компоненту SocialVideo и использовать эту информацию для рендеринга соответствующего контента.  Компонент не будет иметь своего собственного состояния.  Это сделает его многоразовым и предсказуемым, что означает, что один и тот же вход каждый раз равен одному и тому же результату.  Вот законченный компонент.  Если вы следуете дома, убедитесь, что ваш браузер открыт, когда вы сохраняете файл, и смотрите, как обновляется пользовательский интерфейс. 
 import qs from 'query-string'; import React, {Component, PropTypes} from 'react'; export default class SocialVideo extends Component { static propTypes = { service: PropTypes.oneOf(['youtube', 'vimeo', 'dailymotion']).isRequired, video: PropTypes.string.isRequired }; static urlMap = new Map([ ['youtube', 'http://www.youtube.com/embed/'], ['vimeo', 'http://player.vimeo.com/video/'], ['dailymotion', 'http://www.dailymotion.com/embed/video/'] ]); getIdFromVideoString (vString) { const urlArr = vString.split('/'); const idString = urlArr[urlArr.length - 1]; const queryParams = qs.extract(vString); return (queryParams && qs.parse(queryParams).v) || idString || ''; } render() { const {service, video, ...htmlTags} = this.props; const src = `${SocialVideo.urlMap.get(service)}${this.getIdFromVideoString(video)}`; return ( <iframe src={src} frameBorder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen {...htmlTags} /> ); } } 
Давайте разберемся с этим. Как вы могли заметить, мы включили нашу зависимость строки запроса. Это будет использоваться для анализа URL-адресов видео, которые мы отправляем компоненту.
  Компонент требует двух props , которые определены в propTypes : 
-   service— видео провайдер
-   video— URL видео или ID
  Теперь давайте посмотрим, что мы делаем в функции render .  Начнем с: 
 const {service, video, ...htmlTags} = this.props; 
  Что мы делаем здесь, так это деструктурируем props для получения значений service и video , а затем назначаем любые оставшиеся props которые могли быть переданы компоненту, в переменную htmlTags . 
  Теперь нам нужно обработать переменные service и video чтобы сгенерировать переменную src которую мы будем использовать для создания <iframe> .  Вот что делает следующий код: 
 const src = `${SocialVideo.urlMap.get(service)}${this.getIdFromVideoString(video)}`; 
  Здесь мы генерируем строку, начинающуюся со встроенного URL-адреса по умолчанию, который получен из статического свойства urlMap .  Вторая часть строки состоит из идентификатора видео, который генерируется путем вызова функции getIdFromVideoString . 
  Теперь мы вычислили переменную src , нам просто нужно отобразить ее в <iframe> : 
 return ( <iframe src={src} frameBorder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen {...htmlTags} /> ); 
  Обратите внимание, как мы htmlTags предшествующим оператором распространения ( ... ), поэтому, если дополнительные компоненты отправляются компоненту, например: className , style , width , height и т. Д., Они вставляются в <iframe> тег.  Это делает компонент более настраиваемым и динамичным. 
Теперь мы видим, как наш компонент воспроизводит выбранное видео по адресу http: // localhost: 3000 / . Это также показано в следующей демонстрации.
Вывод
В этом кратком совете я показал вам, как создать видео-компонент React, который позволит вашим пользователям переключаться между списком видео. Мы использовали реактор с горячей горячей водой, чтобы запустить нашу среду разработки и увидели горячую перезагрузку в действии. У компонента не было собственного состояния, что делает его многоразовым и предсказуемым (поскольку один и тот же вход каждый раз равен одному и тому же выходу). Целью этого быстрого совета было не только показать вам, как конкретно создать этот компонент, но и продвигать при этом хорошие практики.
Это то, что вы бы использовали? Вы бы построили это по-другому? Я хотел бы услышать от вас в комментариях ниже.