Я хочу обнаружить изменения ориентации экрана, используя событие orientationchange
, которое поддерживается всеми основными мобильными браузерами.
Я добавляю прослушиватель событий в componentDidMount
и устанавливаюсостояние изнутри обратного вызова события.
Однако я вижу, что когда событие запускается впервые в результате изменения с портретного на ландшафтное состояние, состояние не обновляется до ландшафтного.Затем, когда я меняю ориентацию с пейзажа обратно на портрет, штат говорит, что ориентация это пейзаж.После этого каждый раз, когда я меняю ориентацию, состояние всегда говорит о противоположности фактической ориентации.Я не уверен, должен ли я использовать какой-либо метод реагирования жизненного цикла или мое обнаружение не подходит.
Я протестировал код, используя инструменты разработчика Chrome Toggle device toolbar
.Это мой код:
import React from 'react';
class AppInfo extends React.Component {
state = {
screenOrientation: 'portrait'
}
isPortraitMode = () => {
console.log(this.state);
const { screenOrientation } = this.state;
return screenOrientation === 'portrait';
}
setScreenOrientation = () => {
if (window.matchMedia("(orientation: portrait)").matches) {
console.log('orientation: portrait');
this.setState({
screenOrientation: 'portrait'
});
}
if (window.matchMedia("(orientation: landscape)").matches) {
console.log('orientation: landscape');
this.setState({
screenOrientation: 'landscape'
});
}
}
componentDidMount() {
window.addEventListener('orientationchange', this.setScreenOrientation);
}
render() {
console.log(`orientation: from render: isPortraitMode = ${this.isPortraitMode()}`);
<div>
Hello
</div>
}
}
export default AppInfo;