리액트에 대한 2차적인 수업이 들어가게 되었는데, 리액트의 핵심개념이라고 할 수 있는 State 와 Props에 대한 개념을 배우게 되었다.
Props는 외부로부터 전달받은 값을 의미한다.
Props의 특징
props가 읽기 전용이 아니라면, props를 전달받은 하위 컴포넌트 내에서 props를 직접 수정 시 props를 전달한 상위 컴포넌트 값에 영향을 끼치게 때문에, 개발자가 의도하지 않은 효과가 생기고, react의 단방향 흐름원칙에 위배된다.
1. 하위 컴포넌트에 전달하고자 하는 값(data)와 속성을 정의
2. props를 이용하여 정의된 값과 속성을 전달
3. 전달받은 props를 렌더링
//예제코드
import "./styles.css";
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child text={"I'm the eldest child"} />
{/* Child 컴포넌트에 또 다른 문자열을 props 로 전달해 보세요 */}
<Child />
</div>
);
}
function Child(props) {
// console 을 열어 props 의 형태를 직접 확인하세요.
console.log("props : ", props);
return (
<div className="child">
<p>{props.text}</p>
</div>
);
}
export default Parent;
State는 내부에서 변하는 값을 의미
Example ) 스위치의 On/Off 상태
React State를 다루는 방법 중 하나
사용을 위해선 useState를 불러와야한다.
import { useState } from "react";
useState를 호출하는 것은 "state"라는 변수를 선언하는 것과 같다. 일반적인 변수는 함수가 끝날 때 사라지고, state 변수는 react에 의해 함수가 끝나도 사라지지 않음.
Const [state 저장 변수, state 갱신 함수] = useState(상태 초기 값);
state 변수에 저장된 값을 사용하려면 JSX 엘리멘트 안에 직접 불러서 사용해야한다
//예시
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
React의 이벤트 핸들링은 DOM의 이벤트 처리 방식과 유사함.(문법의 차이 有)
* react에서는 이벤트는 소문자 대신 카멜 케이스를 사용
* JSX를 사용하여 문자열이 아닌 함수로 이벤트처리함수를 전달.
//예시
<button onClick = {handleEvent}>Event</button?
Onclick, OnChange 이벤트를 통해 알아보자.
두가지 방법 모두 arrow function을 사용하여 함수를 정의하여야 해당 컴포넌트가 가진 state에 함수들이 접근이 가능하다.
const handleClick = () => {
alert(name);
}
return (
<div>
...
<button onClick={handleClick}>Button</button>
...
</div>
);
...
리액트가 state를 통제할 수 있는 컴포넌트
리액트의 데이터 흐름
테스트가 쉽고, 확장성이 좋다.
페이지를 만들기 이전에 컴포넌트를 먼저 만들고 조립
하나의 컴포넌트는 한 가지 일만한다.
데이터는 위에서 아래로 흐른다.
컴포넌트는 바깥에서 props를 이용해 데이터를 마지막인자 혹은 속성처럼 전달 받을 수 있다.
데이터를 전달하는 주체는 부모컴포넌트
단방향 데이터 흐름이라는 키워드가 리액트를 대표한다.
하나의 State를 기반으로 두 컴포넌트가 영향을 받는다면, 공통 소유 컴포넌트를 찾아서 State를 위치 해야한다.
filter를 통해 트윗의 사용자를 필터링을 거쳐 해당 사용자의 트윗내용을 보여준다.
필터를 해서 드롭다운을 리턴해주는 Component를 Tweet Component 내에 만들어주고, 불러왔음 그래서 Tweet 컴포넌트를 렌더링한 후, 드롭다운을 변경할 때 렌더링을 한번 더 거치는 듯 하다. 그래서 필터 Component를 분해하고, 드롭다운을 그대로 Tweet Component 내에 코드를 수정하였더니 해결이 되었다.