В компоненте React я определяю, как компонент обрабатывает изменение состояния в обратном вызове до setState()
. Это кажется неправильным/против конвенции о потоке. Где правильное место для определения того, как элемент должен вести себя с учетом нового состояния?Обновить компонент React при изменении состояния, используя ссылку на себя
Я предполагаю, что это метод render()
или метод didMount()
.
В этой ситуации, мне нужно вызвать метод JS на элемент DOM:
if (this.state.play) {
document.querySelector(".VideoPlayer-Video").play();
} else {
document.querySelect(".VideoPlayer-Video").pause();
}
Я не могу сделать это до того, как компонент оказаны. Так как &, где это должно быть сделано?
Пример Детали:
Это очень простой компонент реагировать. Он имеет элемент <video>
и кнопку, которая приостанавливает или воспроизводит ее.
Состояние имеет только один атрибут «играть», который является «истинным», если видео воспроизводится или false, если видео приостановлено.
Когда нажата кнопка «играть», я переворачиваю состояние, затем выполняю запрос DOM, чтобы получить элемент видео, и вызывается метод на нем.
Это кажется нетрадиционным в React, так как я рассказываю компоненту, как реагировать на изменение состояния внутри обработчика кликов. Я хотел бы определить, как компонент реагирует на изменение состояния в другом месте, но я не знаю, где.
Где традиционное место, где можно сказать, что элемент видео воспроизводится или нет в ответ на изменение состояния? Как я могу ссылаться на элемент DOM?
Код:
var React = require('react');
module.exports = React.createClass({
getInitialState: function(){
return {
play: true
}
},
render: function(){
return <div className="VideoPlayer">
<video className="VideoPlayer-Video" src="/videos/my-video.mov"></video>
<button className="VideoPlayer-PlayButton" onClick={this.handlePlayButtonClick}>
{this.state.play ? "Pause" : "Play"}
</button>
</div>
},
handlePlayButtonClick: function(){
this.setState({
play: !this.state.play
}), function(){
var video = document.querySelector(".VideoPlayer-Video");
if (this.state.play) {
video.play();
} else {
video.pause();
}
}
}
});
Удивление, если это сочетание 'didMount()' и использования 'this.refs', до сих пор исследования –