Я работаю над созданием компонента медиа-проигрывателя React, который обертывает тег HTML5 <video>
, и мне интересно, как этот тег и его события DOM с архитектурой Flux.Как обращаться с элементами DOM с сохранением состояния с помощью Flux
В Flux, Накопитель компонент прослушивает является источником истины, но с некоторыми элементами, как <video>
тега, сам DOM поддерживает некоторое состояние, например, paused
или currentTime
. Как примирить это состояние с моим хранилищем?
До сих пор у меня есть компонент Player
и PlayerStore
. Когда <video>
происходят события DOM, я отправлял такие действия Flux, как handlePlay
, handlePause
и handleTimeUpdate
, чтобы предоставить обновления PlayerStore
, чтобы хранилище могло сохранить это состояние. Кроме того, мой собственный пользовательский элемент управления контролирует отправку одних и тех же действий, но я не уверен, как «установить» состояние элемента <video>
только тогда, когда исходное событие было от элементов управления, а не <video>
событий; то есть я не хочу застрять в цикле, где, например:
<video>
посылает «мой таймкод изменилось» DOM событие- Компонент слышит событие DOM и отправляет действие
- Магазин получает действие и обновляет себя с помощью нового временного кода
- Компонент, слушающий Store, слышит изменения и устанавливает (каким-то образом) новый временный код в элементе
<video>
. Однако нет причин, так как элемент<video>
уже знал об изменении - это тот, который вызвал его, в первую очередь, несколько миллисекунд назад!
Как вы подходите к такому компоненту?
Почему бы не отслеживать состояние воспроизведения/паузы в самом компоненте (как в 'this.setState')? И зачем отправлять действия для таких вещей, как 'handlePlay'? Что-нибудь вне вашего компонента должно знать об этих событиях? – ray
Вот как бы я это сделал: http://codepen.io/FullR/pen/YXLQyO?editors=001 (не пример функционирования, просто базовая структура) Но я предполагаю, что вам не нужно мутировать состояние (например, программное изменение состояния паузы или время через пройденную опору). Если вам нужно изменить эти вещи, я бы предложил воспользоваться компилятором 'componentDidUpdate', чтобы внести необходимые изменения в элемент'
Я планирую сохранить текущее время воспроизведения в базе данных, поэтому я задействую Store (и контейнерный компонент). –