useState
에서 반환되는 modifier
함수를 사용한다. modifier
함수의 인자가 되는 콜백 함수는, 인자로 event
를 받을 수 있다. state : 데이터가 저장되는 곳
<script type="text/babel">
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();
</script>
→ 카운터가 증가할 때마다, 다시 렌더링해주기 위해 countUp
함수에서 render
함수를 재호출
→ 다만, render
를 재호출하는 것을 작성자가 빠뜨릴 수 있으므로, 사실 좋은 방법이 아니다.
[ Vanilla Javascript의 노드 변경 처리 ]
[ React JS ]
<script type="text/babel">
const root = document.getElementById("root");
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);
</script>
[ React.useState
의 사용 ]
modifier
함수는 값을 변경하고, 자체적으로 컴포넌트 리렌더링을 해 준다. → modifier
함수를 사용하여 state를 변경할 때, 컴포넌트가 재생성되며 리렌더링된다!
counter
변수가 다른 곳에서 변경되었을 수 있음.&rarr -> 현재 값을 인자로 받는, 콜백 함수를 사용하기.
const onClick = () => {
setCounter(counter + 1);
setCounter((current => current + 1)
}
→ 확실히 현재의 값이라는 걸 보장할 수 있는 방법!
<script type="text/babel">
function App() {
return (
<div>
<h1 className="hi">Super Converter</h1>
<label htmlFor="minutes">Minutes</label>
<input id="minutes" placeholder="Minutes" type="number" />
<label htmlFor="hours">Hours</label>
<input id="hours" placeholder="Hours" type="number" />
</div>
)
}
const root = document.getElementById("root");
ReactDOM.render(
}
</script>
label
태그에서 기본적인 for
및 h1
태그에서 기본적인 class
를 사용하면,for
는 HtmlFor, class
는 className
으로 수정해 줘야 한다.production
-> development
로 변경해야 확인이 가능production
은 배포 모드, development
는 개발 모드를 의미<script type="text/babel">
function App() {
const [minutes, setMinutes] = React.useState();
const onChange = (event) => {
setMinutes(event.target.value);
}
return (
<div>
<h1 className="hi">Super Converter</h1>
<label htmlFor="minutes">Minutes</label>
<input id="minutes" placeholder="Minutes" type="number" onChange={onChange} />
<label htmlFor="hours">Hours</label>
<input id="hours" placeholder="Hours" type="number" />
</div>
)
}
const root = document.getElementById("root");
ReactDOM.render(
}
</script>
input
에 변화가 생기면 (onChange
) event를 매개 변수로 받는 onChange
함수를 실행한다.event
에서 입력된 값을 꺼내서 setMinutes
함수로 설정해 준다.[ cf. SyntheticEvent ]
<script type="text/babel">
function App() {
const [minutes, setMinutes] = React.useState();
const onChange = (event) => {
setMinutes(event.target.value);
}
return (
<div>
<h1 className="hi">Super Converter</h1>
<div>
<label htmlFor="minutes">Minutes</label>
<input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={onChange} />
<label htmlFor="hours">Hours</label>
<input value={minutes / 60} id="hours" placeholder="Hours" type="number" />
</div>
</div>
)
}
const root = document.getElementById("root");
ReactDOM.render(
}
</script>
<script type="text/babel">
function App() {
const [minutes, setMinutes] = React.useState();
const onChange = (event) => {
setMinutes(event.target.value);
}
const reset = () => setMinutes(0); // 추가한 부분!!
return (
<div>
<h1 className="hi">Super Converter</h1>
<div>
<label htmlFor="minutes">Minutes</label>
<input value={minutes} id="minutes" placeholder="Minutes" type="number" onChange={onChange} />
<label htmlFor="hours">Hours</label>
<input value={minutes / 60} id="hours" placeholder="Hours" type="number" />
</div>
</div>
<button onClick={reset}>Reset</button> // 추가한 부분!!
)
}
const root = document.getElementById("root");
ReactDOM.render(
}
</script>
<script type="text/babel">
function App() {
const [amount, setAmount] = React.useState();
const [flipped, setFlipped] = React.useState(false); // 추가한 부분
const onChange = (event) => {
setAmount(event.target.value);
}
const reset = () => setMinutes(0); // 추가한 부분!!
const onFlip = () => {
reset();
setFlipped((current) => !current_
}
return (
<div>
<h1 className="hi">Super Converter</h1>
<div>
<label htmlFor="minutes">Minutes</label>
<input
value={amount}
id="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
disabled={flipped} />
<label htmlFor="hours">Hours</label>
<input
value={flipped ? amount : Math.found(amount / 60)}
id="hours"
placeholder="Hours"
type="number"
disabled={flipped === false} />
</div>
</div>
<button onClick={reset}>Reset</button> // 추가한 부분!!
)
}
const root = document.getElementById("root");
ReactDOM.render(
}
</script>
flipped
state를 추가한다.disabled
옵션)를 변경한다!<script type="text/babel">
function MinutesToHours() {
// 기존 코드
}
function kmToMiles() {
// TODO
}
function App() {
const [index, setIndex] = React.useState("xx");
const onSelect = event => {
setIndex(event.target.value);
}
return (
<div>
<h1>Super Converter</h1>
<select value={index} onChange={onSelect}>
<option value="xx">Select your units</option>
<option value="0">Minutes & Hours</option>
<option value="1">Km & Miles</option>
</select>
<hr />
{index === "xx" ? "Please select your units" : null}
{index === "0" ? <MinutesToHours /> : null}
{index === "1" ? <KmToMiles /> : null}
</div>
)
}
}
</script>
index
state를 추가한다. select
태그의 onChange
속성으로, 선택한 value에 따라 다른 컴포넌트를 렌더링!