다음 예제 코드는 time 속성으로 전달한 값을 CSS에 사용하는 상태비저장 아날로그 형식 컴포넌트다(ch04/clock-analog-digital/jsx/analog-display.jsx).5
예제 코드 4.7 상태비저장 아날로그 형식 컴포넌트
const AnalogDisplay = function AnalogDisplay(props) { let date = new Date(props.time) ---- 문자열로 된 날짜를 객체로 변환하여 사용할 수 있도록 한다. let dialStyle = { position: 'relative', top: 0, left: 0, width: 200, height: 200, borderRadius: 20000, ---- <div>를 원으로 만들기 위해서 너비에 비해 상대적으로 큰 borderRadius(일반적인 CSS의 경우 border-radius) 값을 적용한다. borderStyle: 'solid', borderColor: 'black' } let secondHandStyle = { position: 'relative', top: 100, left: 100, border: '1px solid red', width: '40%', height: 1, transform: 'rotate(' + ((date.getSeconds() / 60) * 360 - 90).toString() + 'deg)', ---- 각도를 계산하고 초침을 90도 뒤로 회전시켜서 수평 위치에서 시작하도록 한다. transformOrigin: '0% 0%', ---- transformOrigin을 사용하여 회전의 원점을 지정한다. backgroundColor: 'red' } let minuteHandStyle = { position: 'relative', top: 100, left: 100, border: '1px solid grey', width: '40%', height: 3, transform: 'rotate(' + ((date.getMinutes() / 60) * 360 - 90).toString() + 'deg)', transformOrigin: '0% 0%', backgroundColor: 'grey' } let hourHandStyle = { position: 'relative', top: 92, left: 106, border: '1px solid grey', width: '20%', height: 7, transform: 'rotate(' + ((date.getHours() / 12) * 360 - 90).toString() + 'deg)', transformOrigin: '0% 0%', backgroundColor: 'grey' } return <div> <div style={dialStyle}> ---- 시계 다이얼(원판)을 위한 스타일을 적용하여 컨테이너를 렌더링한다. <div style={secondHandStyle}/> <div style={minuteHandStyle}/> <div style={hourHandStyle}/> </div> </div> }
5 역주 한글 운영체제에서 clock-analog-digital 예제를 열어보면 시계침이 움직이지 않는 것을 확인할 수 있다. toLocaleString()으로 생성한 한글이 포함된 시간 형식을 다시 Date 객체로 변환하지 못해서 각도를 정상적으로 계산하지 못하기 때문에 그렇다. Clock 컴포넌트(clock.jsx)에서 toLocaleString()을 호출할 때 인자로 'en'을 추가하여 toLocaleString('en')으로 호출하도록 하면 해결할 수 있다.