React js UI 바뀐 부분만 업데이트해주고 있음
바뀐 부분만 업데이트 해주면 됨! => 인터렉티브한 어플
우리 필요한거 - 데이터가 바뀔 때마다 Container의 리렌더링
1)컴포넌트, JSX 변수 추가하고 싶을 떄
{counter} 매우 간단
2) UI 업데이트 부분 보여주고 싶다면, render 함수 다시 호출
👉 리렌더링 발생시킬 가장 좋은 방법
modifier 함수 그 값 업데이트 -> 리렌더링(화면 refresh)
사용자 input 어떻게 받는지, form을 만들었을 때 state 어떤 식 작용
state 바꾸는 2가지 방법
setCounter(counter+1); //1.직접 값 설정
setCounter((current) => current+1);//2.함수 전달하기
👏둘 다 현재 state로 새로운 값 계산 BUT 아래쪽 방법 안전
current가 확실하게 현재 값이라는 것을 보장(예상치 못한 업데이트 혼동 방지)
과정 간단 요약
1)state 만들음 - setState 결과 array
2)input의 value를 state로 연결 (어디서든 value 수정 가능)
3)onChange 함수 - 데이터 업데이트 역할
"onChange 삭제? state연결 input 남아있음"
단위 변환 뒤집어보는 함수 (flip function)
: 단순히 true 혹은 false 변수
function MinutesToHours(){
const [amount, setAmount] = React.useState();
const [flipped, setFlipped] = React.useState(false);//state 결과값 array [array 첫번째 아이템,데이터 수정 함수]
const onChange = (event) => {
setAmount(event.target.value);
};
const reset = () => setAmount(0);
const onFlip = () => {
setFlipped((current) => !current);
reset();
}; // flipped이 true, false 변환! "반대 도출 명령" , reset함수 - flip할 때마다 변환 값 바뀌어서 작성했다
return(
<div>
<h1>Converter</h1>
<div>
<label htmlFor="minutes">Minutes</label>
<input
value={flipped ? amount*60 : amount} //삼항연산자 " flipped 상태라면, state 있는 값 그대로 보여줘라! 아니라면? 반대"
id="minutes"
placeholder="Minutes"
type="number"
onChange={onChange}
disabled={flipped}
/>
</div>
<div>
<label htmlFor="hours">Hours</label>
<input
value={flipped ? amount : amount/60}
id="hours"
placeholder="Hours"
type="number"
disabled={!flipped}
onChange={onChange}
/>
</div>
<button onClick={reset}>Reset</button>
<button onClick={onFlip}>Flip</button>
</div>
);
}
=> 추가학습은 크게 없음,,, 작은 컴포넌트로 분할(분할정복)
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> //=> select의 change event 리스닝 사용자 번호 선택? setIndex이용 숫자 state안에 넣
// if 데이터 수정 위해 modifier 함수 사용? 컴포넌트 새로운 데이터와 새로고침
<hr/>
{index === "xx" ? "Please select your unit." : null} //{}안에서 JS 사용 가능
{index === "0" ? <MinutesToHours/> : null}
{index === "1" ? <KmToMiles/> : null}
</div>
);
}
: 부모 컴포넌트로부터 자식 컴포넌트에 데이터 보낼 수 있게 해주는 방법
function SaveBtn(){
return <button style={{
backgroundColor : "tomato",
color:"white",
padding:"10px 20px",
border: 0,
borderRadius:10,
}}>Save Changes</button>
}
function ConfirmBtn(){
return <button style={{
backgroundColor : "tomato",
color:"white",
padding:"10px 20px",
border: 0,
borderRadius:10,
}}>Confirm</button>
}
function Btn(props){
console.log(props)
return <button style={{
backgroundColor : "tomato",
color:"white",
padding:"10px 20px",
border: 0,
borderRadius:10,
}}>Save Changes</button>
} //props는 Btn 전달받는 첫번째이자 유일한 인자, 오브젝트
function App (){
return(
<div>
<Btn banana="Save Changes" /> //어떤 prop이든, Btn컴포넌트 보내면 Btn함수 첫번째 argument!
<Btn banana="Continue" />
</div>
);
}
Props: Btn 전달받는 첫번째이자 유일한 인자, 오브젝트
if) prop의 이름을 변경한다면? 컴포넌트 이름도 동시에 바꿔야 함
prop 전달할 때 이름, 받아서 사용할 때 이름 동일해야 함!
👉 뭐든 여기에 prop으로서 넣는다고 하면, 자동적으로 return에 들어가지는 않음
문제) 컴포넌트를 가지고 있는데 너무 많은 props를 가질 경우 발생
<script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>
설치 후,
Btn.propTypes = {
text: PropTypes.string,
fontSize: PropTypes.number,
}
👉 props 타입이 뭐고, 어떤 모양인지 설명해줄 수 있음
이와 같은 경고 문구 나타남!!