왜 state 씀?
- state를 렌더링 조건으로, 변경된 부분을 갱신하기 위해 사용한다.
state는 새로운배경, 새주소로 갱신해야 렌더링된다.
기존 state vs 새로운 state 주소 값을 비교하여 주소가 달라야 변화를 감지하고 렌더링한다.
컴포넌트 사용 중 컴포넌트 내부에서 변하는 값
ex) 나이, 현재 사는 곳, 취업 여부, 결혼 여부
import { useState } from "react"; // useState 불러오기
function CheckboxExample() {
// 1번 코드(구조분해할당)를 풀어쓰면
const [isChecked, setIsChecked] = useState(false);
// const [state 저장 변수, state 갱신 함수] = useState(상태 초기 값);
//...
// 2번 코드와 같습니다.
const stateHookArray = useState(false);
const isChecked = stateHookArray[0];
const setIsChecked = stateHookArray[1];
}
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
// isChecked : state를 저장하는 변수
// setIsChecked : state isChecked 를 변경하는 함수
const handleChecked = (event) => {
setIsChecked(event.target.checked); // 상태변경함수 호출로 변경해야한다
//isChecked = true; 강제변경시도하면 리렌더링이 안되거나 상태변경이 안된다.
};
return (
<div className="App">
<input type="checkbox" checked={isChecked} onChange={handleChecked} />
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
</div>
);
}
<input type="checkbox" checked/>
외부로부터 전달받은 바꿀 수 없는 값
ex) 이름, 성별
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child text={"I'm the eldest child"} />
// attribute={value}
<Child />
</div>
);
}
function Child(props) {
console.log(props); // {text: "I'm the eldest child"}
return (
<div className="child">
<p>{props.text}</p>
</div>
);
}
export default Parent;
<Child attribute={value}/>
로 속성을 넣고 function Child(props)
로 props를 받는다<button onclick="handleEvent()">Event</button>
<button onClick={handleEvent}>Event</button>
input
의 텍스트 변경시마다 발생하는 이벤트
form
요소는 사용자 입력값 제어하는 데 사용
<input> <textarea> <select>
등
이렇게 변경될 수 있는 입력값은 컴포넌트의 state로 관리하고 업데이트
e.target.value
로 이벤트 객체에 담겨있는 input 값 불러올 수 있음
input에 onChange이벤트가 발생하면 handleChange 함수 실행되고,
handleChange 함수에서는 이벤트 객체에 담긴 input 값을 setState 갱신함수를 통해 새로운 state로 갱신한다.
function NameForm() {
const [name, setName] = useState("");
const handleChange = (e) => {
setName(e.target.value);
}
return (
<div>
<input type="text" value={name} onChange={handleChange}></input>
<h1>{name}</h1>
</div>
)
};
사용자가 클릭했을 때 발생하는 이벤트
<button>, <a>
의 링크 이동 등과 같이 클릭 시 사용하는 이벤트버튼 클릭 시 input에 입력한 내용을 alert로 알림 창 띄우기
OnClick={함수()}
function NameForm() {
const [name, setName] = useState("");
const handleChange = (e) => {
setName(e.target.value);
}
return (
<div>
<input type="text" value={name} onChange={handleChange}></input>]
//틀린방법. alert함수를 바로 호출하면, 바로 실행되버림
<button onClick={alert(name)}>Button</button>
<h1>{name}</h1>
</div>
);
};
onClick={() => alert(name)}
return (
<button onClick={() => alert(name)}>Button</button>
);
onClick={handleClick}
const handleClick = () => {
alert(name);
};
return (
<button onClick={handleClick}>Button</button>
);
import React, { useState } from "react";
export default function App() {
const [showPopup, setShowPopup] = useState(false);
const togglePopup = () => {
// Pop up 의 open/close 상태에 따라
// 현재 state 가 업데이트 되도록 함수를 완성하세요.
setShowPopup(!showPopup);
};
return (
<div className="App">
<h1>Fix me to open Pop Up</h1>
{/* 버튼을 클릭했을 때 Pop up 의 open/close 가 작동하도록
button tag를 완성하세요. */}
<button className="open" onClick={togglePopup}>Open me</button>
{showPopup ? (
<div className="popup">
<div className="popup_inner">
<h2>Success!</h2>
<button className="close" onClick={togglePopup}>
Close me
</button>
</div>
</div>
) : null}
</div>
);
}
import React, { useState } from "react";
export default function App() {
const [username, setUsername] = useState("");
const [msg, setMsg] = useState("");
return (
<div className="App">
<div>{username}</div>
<input
type="text"
value={username}
onChange={(event) => setUsername(event.target.value)}
placeholder="여기는 인풋입니다."
className="tweetForm__input--username"
></input>
<div>{msg}</div>
{/* TODO : 위 input과 같이 입력에 따라서 msg state가 변할 수 있게
아래 textarea를 변경하세요. */}
<textarea
placeholder="여기는 텍스트 영역입니다."
className="tweetForm__input--message"
onChange={() => setMsg(event.target.value)}
value={msg}
></textarea>
</div>
);
}
https://reactwithhooks.netlify.app/docs/forms.html