강의, 책/[React] ReactJS로 영화 웹 서비스 만들기

#3. State

hye3193 2024. 2. 15. 16:55

State

const root = document.getElementById("root");
let counter = 0;

const Container = () => (
    <div>
        <h3>Total clicks: {counter}</h3>
        <button>Click me</button>
    </div>
);

ReactDOM.render(<Container />, root);

content를 작성하던 위치에 중괄호를 열고 변수를 담아줄 수 있다

변경 사항을 다시 HTML 문서에 반영하고 싶다면 전체를 재렌더링해 주면 된다

 

function App() {
    const data = React.useState();
    const counter = data[0];
    const modifier = data[1];
    return (
        <div>
            <h3>Total clicks: {counter}</h3>
            <button>Click me</button>
        </div>
    );
}

위와 같은 방식으로 useState를 이용하여 data의 값을 출력할 수 있다

 

const food = ["tomato", "potato"];
const [firstFood, secondFood] = food;
// firstFood = "tomato"
// secondFood = "potato"

그런데 배열에 인덱스를 활용하지 않아도 위처럼 이름을 할당해 줄 수 있다

 

따라서 위 코드를 아래와 같이 변경해 줄 수 있다

function App() {
    const [counter, modifier] = React.useState();
    return (
        <div>
            <h3>Total clicks: {counter}</h3>
            <button>Click me</button>
        </div>
    );
}

 

useState를 사용하면 배열을 반환해주는데, 배열의 0번째는 변수, 배열의 1번째는 해당 변수의 값을 변경해주는 함수를 의미한다

따라서 modifier라는 이름의 함수를 사용하면, counter 변수의 값이 바뀌면서 동시에 리렌더링해 준다

(보통 [counter, SetCounter] 등으로 modifier 함수는 변수의 이름 앞에 Set을 붙여서 이름을 할당한다)

function App() {
    const [counter, modifier] = React.useState();
    const onClick = () => {
        modifier(counter + 1);
    };
    return (
        <div>
            <h3>Total clicks: {counter}</h3>
            <button onClick={onClick}>Click me</button>
        </div>
    );
}

위와 같이 작성하게 되면, 버튼을 클릭했을 때 onClick 함수가 호출되고, modifier 함수가 호출되면서 counter의 값이 counter + 1으로 변경되고, 리렌더링 되어 화면에서 볼 수 있게 된다

* App 컴포넌트를 리렌더링 하는 것이므로, 함수 내에 명령어를 적어두었다면 해당 명령어도 리렌더링 될 때마다 실행된다

 

State를 바꾸는 데에는 여러 방법이 있는데

setCounter(counter + 1);
setCounter((current) => current + 1);

직접 counter 변수를 들고 와서 1을 더해줄 수도 있고, 현재 변수의 값을 가져와 여기에 1을 더해줄 수도 있다

두번재 방법이 더 바른 방법이다

 

* 기존 HTML을 이용해서 input과 label을 연결시켜 줄 땐 아래와 같이 코드를 작성한다

<label for="minutes">Minutes</label>
<input id="minutes" placeholder="Minutes" type="number" />

 

그러나 class나 for같은 단어들은 javascript 상에서 선점된 단어이므로

class => className
for => htmlFor

위와 같이 바꿔서 써주어야 한다

* script tag에서 뒤에 붙는 production은 배포 모드, development는 개발 모드(위와 같은 경우 경고하는 검증 코드 포함)를 의미한다

 

Input and States

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
                value={minutes}
                id="minutes"
                placeholder="Minutes"
                type="number"
                onChange={onChange}
            />
        </div>
    );
}

input에 뭔가 입력하면 onChange함수가 호출되고, event.target을 통해 input의 value에 접근하여 해당 값을 minutes에 넘겨준다

 

+

return 중간에 중괄호를 사용하면 그 부분은 자바스크립트 코드를 작성할 수 있다

return (
    <div>
        <span>test</span>
        {index === "0" ? <MinutesToHours /> : null}
        {index === "1" ? <KmToMiled /> : null}
    </div>
)

index가 0이라면 MinutesToHours라는 컴포넌트를 띄우고,

index가 1이라면 KmToMiled 컴포넌트를 띄우게 된다

(return 외 다른 부분은 생략한 상태)

 

'강의, 책 > [React] ReactJS로 영화 웹 서비스 만들기' 카테고리의 다른 글

#6. Effects  (0) 2024.02.17
#4. Props  (0) 2024.02.16
#2. The Basics of React  (0) 2024.02.15