[3.0] Understanding State
1) 변경된 부분만 업데이트되는 것이 좋은 이유
리액트가 아닌 경우, 일반 자바스크립트를 쓴 브라우저는 노드정보가 바뀔때마다 노드트리를 처음부터 5단계에 걸쳐서 다시 생성함
그러나 리액트는 가상돔을 써서 우리 시야에 보이는 부분만 수정해서 보여주고 모든 업뎃이 끝나면 일괄로 합쳐서 실제 돔에 투척
const root = document.getElementById('root')
let counter = 0
function countUp() {
counter = counter + 1
render()
}
function render() {
ReactDOM.render(<Container />, root)
}
const Container = () => (
<div>
<h3>Total clicks: {counter}</h3>
<button onClick={countUp}>Click me</button>
</div>
)
render()
2) 클릭 카운터 보여주는 것 만들기
[3.1] setState part One
React.useState() 함수는 초기값을 설정할 수 있음
즉, undefined는 초기값이고 두 번째 요소인 f는 그 값을 바꾸는 함수
배열을 꺼내기
const x = [1, 2, 3]
const [a, b, c] = x;
으로 꺼낼 수 있음
function App() {
const [counter, modifier] = React.useState(20)
return (
<div>
<h3>Total clicks: {counter}</h3>
<button>Click me</button>
</div>
)
}
[3.2] setState part Two
function App() {
const [counter, setCounter] = React.useState(0)
const onClick = () => {
setCounter(counter + 1)
}
return (
<div>
<h3>Total clicks: {counter}</h3>
<button onClick={onClick}>Click me</button>
</div>
)
}
ReactDOM.render(<App />, root)
[3.4] state Functions
const [counter, setCounter] = React.useState(0)
const onClick = () => {
// setCounter(counter + 1)
setCounter((current) => current + 1)
}
[3.5] inputs and State
1) className, htmlFor
<script type="text/babel">
function App() {
const [minutes, setMinutes] = React.useState()
const onChange = (event) => {
setMinutes(event.target.value)
}
return (
<div>
<h1 className="title">Super Converter</h1>
<label htmlFor="minutes">Minutes</label>
<input
value={minutes}
id="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
/>
<h4>You want to convert {minutes}</h4>
<label htmlFor="hours">Hours</label>
<input id="hours" placeholder="Hours" type="number" />
</div>
)
}
const root = document.getElementById('root')
ReactDOM.render(<App />, root)
</script>
[3.6] State practice part One
function App() {
const [minutes, setMinutes] = React.useState()
const onChange = (event) => {
setMinutes(event.target.value)
}
const reset = () => setMinutes(0)
return (
<div>
<h1>Super Converter</h1>
<div>
<label htmlFor="minutes">Minutes</label>
<input
value={minutes}
id="minutes"
placeholder="minutes"
type="number"
onChange={onChange}
/>
</div>
<div>
{' '}
<label htmlFor="hours">Hours</label>
<input
value={Math.round(minutes / 60)}
id="hours"
placeholder="Hours"
type="number"
/>
</div>
<button onClick={reset}>Reset</button>
</div>
)
}
const root = document.getElementById('root')
ReactDOM.render(<App />, root)
[3.7] State practice part Two
function App() {
const [amount, setAmount] = React.useState(0)
const [flipped, setFlipped] = React.useState(false)
const onChange = (event) => {
setAmount(event.target.value)
}
const reset = () => setAmount(0)
const onFlip = () => {
reset()
setFlipped((current) => !current)
}
return (
<div>
<h1>Super Converter</h1>
<div>
<label htmlFor="minutes">Minutes</label>
<input
value={flipped ? amount * 60 : amount}
id="minutes"
placeholder="minutes"
type="number"
onChange={onChange}
disabled={flipped}
/>
</div>
<div>
{' '}
<label htmlFor="hours">Hours</label>
<input
value={flipped ? amount : Math.round(amount / 60)}
id="hours"
placeholder="Hours"
type="number"
disabled={!flipped}
onChange={onChange}
/>
</div>
<button onClick={reset}>Reset</button>
<button onClick={onFlip}>Flip</button>
</div>
)
}
const root = document.getElementById('root')
ReactDOM.render(<App />, root)
1) flip 버튼 만들어주기
<input
value={flipped ? amount : Math.round(amount / 60}
id="hours"
disabled={!flipped}
/>
-!flipped / true
disabled인 것은 minutes
minutes amount * 60
hours amount
=> 결론적으로 true일때 값을 쓰고 그 값이랑 관련된 다른 변화 값 연결!
4) 마지막 변경 해줄 때 리셋
const onFlip = () => {
reset()
setFlipped((current) => !current)
}