Эта статья была рецензирована Крейгом Билнером . Спасибо всем рецензентам 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, который позволит вашим пользователям переключаться между списком видео. Мы использовали реактор с горячей горячей водой, чтобы запустить нашу среду разработки и увидели горячую перезагрузку в действии. У компонента не было собственного состояния, что делает его многоразовым и предсказуемым (поскольку один и тот же вход каждый раз равен одному и тому же выходу). Целью этого быстрого совета было не только показать вам, как конкретно создать этот компонент, но и продвигать при этом хорошие практики.
Это то, что вы бы использовали? Вы бы построили это по-другому? Я хотел бы услышать от вас в комментариях ниже.