전체 화면 설정 메서드 document.documentElement.requestFullscreen() 전체 화면 해제 메서드 document.exitFullscreen()
전체화면 설정/해제 버튼에 이벤트를 걸어서 사용할 수 있으며, 반환형은 Promise이다.
만약 allowfullscreen 속성이 없는 iframe에서 해당 메서드를 호출하면 어떻게 될까?disallowed by permissions policy 에러로 사람을 당황시킨다.
이 때는 allowfullscreen 속성의 존재 여부(true)를 체크해주면 되는데, 해당 속성은 document.fullscreenEnabled 속성을 사용해 true/false로 확인한다.
만약 iframe에 allowfullscreen 속성이 없을 때 전체 화면 버튼을 비활성화하고 싶을 때는 어떻게 할까?
document.fullscreenEnabled를 체크해서 활성/비활성을 결정하면 되는데 document is not defined와 같은 에러를 피하기 위해서는 useEffect 내부에서 해당 작업을 처리하여 렌더링이 완료된 시점에 document에 접근하도록 해야 한다.
변경이 하나라면 리렌더링이 한번만 발생하지만 수십 개, 수백 개의 값이 계속 변경된다면 리액트는 매번 렌더링만 하다가 생을 마감하고 말 것입니다. 속도는 말할 것도 없구요.
따라서 변경된 값들을 모아 한번에 업데이트를 진행하여 렌더링을 줄이고자 배치(Batch) 기능을 사용해 비동기로 작동한다고 볼 수 있습니다.
참고로 배치 업데이트는 16ms 주기라고 합니다!
18 버전에서 추가될 자동배치(Automatic Batching)는 기존에 이벤트 핸들러에서만 실행되던 배치가 이제는 setTimeout, Promise 등의 이벤트에서도 동작될 예정이며, flushSync() 등을 사용해 예외를 둘 수도 있다고 하여 많은 기대를 받고 있는 것 같아 미리 알아두면 좋을 것 같습니다.
위와 같이 각각의 컴포넌트는 [ 마운팅 -> 업데이트(반복) -> 언마운팅 ]의 라이프사이클을 갖습니다.
이전에는 직관적인 이름을 갖는 다양한 메소드(componentWillMount, componentWillReceiveProps, shouldComponentUpdate, componentWillUpdate)를 통해 이벤트 발생 시점마다 세세한 조작이 가능했으나 현재는 버그나 안전성의 이유로 점점 더 단순해지고 있습니다.
위 기능을 모두 대체하는 훅(Hook)이 너무 편해서 클래스형 컴포넌트를 반드시 사용해야 하는 상황이 아니라면 함수형 컴포넌트와 함께 useEffect를 사용하는 방법이 권장되고 있습니다.
라이프사이클 별로 메소드를 사용하는 방법은 다음과 같습니다.
class TestList extends React.Component {
constructor(props) {
super(props);
this.state = {
counter:0
}
}
// 마운팅 직후 실행
// 마운팅 전 실행은 constructor() 사용
componentDidMount(){
console.log('component Mounted');
}
// 업데이트 후 이전 데이터를 파라미터로 가져옴
componentDidUpdate(prevProps) {
if(prevProps !== this.props) {
this.setState({counter:++this.state.counter})
}
}
// 언마운팅 직전 실행
componentWillUnmount(){
console.log('component Unmounted');
}
render() {
return (
<div>{this.state.counter}</div>
);
}
}
마운팅 이벤트는 실제 DOM에 컴포넌트를 추가하는 이벤트입니다.
마운팅 이벤트는 다른 프레임워크나 라이브러리 또는 데이터와 연결하는 작업에 적절합니다.
업데이트 이벤트는 컴포넌트의 업데이트와 관련이 있으며, props, state 등의 변경이 있을 때 렌더링 관련한 작업을 설정합니다.
언마운팅은 DOM에서 요소를 분리하거나 제거하는 이벤트입니다.
언마운팅 이벤트는 타이머 제거, 요소 제거, 이벤트 제거 등 설정한 요소의 정리, 제거에 사용합니다.
2. 함수형 컴포넌트와 useEffect(Hook)
리액트 16.8부터 추가된 훅(Hook)은 클래스를 사용하지 않아도 state 또는 리액트의 여러 기능을 편하게 사용하도록 해주는 기능입니다.