이하는 React Docs Beta (https://beta.reactjs.org/learn)를 읽고 이해한 내용을 정리한 포스트이다.
1) React 용어 정리
JSX
: React에서 사용하는 markup으로 html, css와 유사하게 동작한다.
HTML보다 조건이 많은데, 대표적으로 조건과 사용방법은 다음과 같다.
1) 모든 tag는 close되어 있어야 함
2) 큰 tag 하나로 묶여있어야 함
3) 대부분에 camelCase를 사용
4) {JS} : JSX태그 안에 or attribute처럼 사용
5) {{JS}} : Object 전달
component
: JavaScript 함수 or class를 의미.
이때 class는 대문자로 시작해야하는데, 소문자인 경우 태그로 취급하여 실행이 안된다.
prop
: 다른 component로 데이터를 전달한다. 데이터 흐름을 동적으로 설정할 때 사용한다.
쉽게 함수에 전달되는 인자와 유사하다고 이해했다.(=argument)
Hooks
: use~~로 시작하는 함수를 hooks라고 불리우며 동적인 값 변경에 사용한다.
ex) [state, stateSetter] = useState(0);
React.DOM과 root
: DOM은 Document Object Model의 약자로, 트리처럼 구조화된 텍스트의 추상화를 의미한다. 이때 텍스트는 웹 개발자에겐 HTML이고, HTML의 element들은 DOM의 노드가 된다. 즉 DOM은 HTML의 메모리 내 표현이다. 요즘 DOM은 매우 커졌기 때문에, 동적으로 작동하는 어플리케이션의 경우 이 큰 DOM 트리를 끊임없이 수정해야하고, overhead가 매우 크다. 이러한 이유로 등장한 것이 가상화 DOM, React.DOM이다.(react가 virtual DOM을 처음 만든것은 아니다)
그 DOM 구조 중 ID가 root인 컴포넌트는 가장 최상위 컴포넌트이며 DOM 트리 구조의 최상위 노드이다. 자바스크립트와 연결해주는 요소로, 이 연결된 곳에 만들어진 컴포넌트들이 보여질 것이다.
render()와 hydrate()
render() : React 엘리먼트를 container DOM에 렌더링하고 컴포넌트에 대한 참조를 반환한다. 하지만 React.DOM.render()를 사용하여 container에 이벤트를 보충하는 것은 17버전 이후로 금지되었으며, 이는 hydrate()를 사용한다.
hydrate() : render와 동일하나 ReactDOMServer로 렌더링 된 컨테이너에 이벤트를 보충하는데 사용된다.
JSON API
: javascript에서의 객체 표현 기법
2) React design steps
1. UI를 component 계층으로 분해
2. interactivity가 없는 static version을 생성
3. 변경 데이터들의 집합으로 state를 생성
- 이때, prop이나 기존 data를 통해 알 수 있는 정보는 state가 아님
4. state를 선언할 위치 계층구조에서 파악하기
5. 입력 등 데이터 변화를 통해 바뀌는 inverse data flow 설정하기
UI description
- Export and Import
: python이나 c등 다른 언어와 마찬가지로 다른 변수, 클래스, 함수에 붙여 다른 파일에서도 사용 가능하게 해준다.
* default : main처럼 각 파일마다 하나씩 존재하며 export와 함께 붙는 suffix.
* 다른 함수에서 사용할 때 default가 붙어있으면 이름을 변경해서 사용이 가능하며, export const의 경우에는 불가능.
* 사용 : import { NAMED_EXPORT1, NAMED_EXPORT2, .. } from ...
import DEFAULT_EXPORT from ...
- Props
: properties의 줄임말로 다른 언어에서의 argument와 유사하게 사용된다.
* props는 읽기 전용이다
* <... {...props} /> 처럼 JSX spread syntax로 모든 속성을 전달 가능하다
* destructuring syntax : function(props)가 아닌 function({ component1, component2, ...}) 처럼 인자를 전달하는 방식
3) Conitional Rendering
- if
: 다른 조건문과 비슷하게 동작한다.
- expression ? (True) : (False)
: expression이 true인 경우 : 앞을, false인 경우 뒤를 return 한다.
- && , ||
: ?연산자에서 true나 false expression이 필요 없는 경우, 사용한다.
* (expression) && (true)
* (expression) || (false)
console.log(true && 1 > 0 && 'success'); //success
console.log(true && 1 < 0 && 'success'); //false
console.log(1 > 0 || 'success'); //true
console.log(1 < 0 || 'success'); //success
단, 이때 조건으로 사용된 expression이 숫자인 경우, boolean 연산을 수행하기 때문에 다른 expression을 사용해야 한다.
4) List Rendering
- map()
: 주어진 함수에 각 배열의 요소를 전달한 후 얻은 결과를 새로 배열로 return
MAP.map(FUNCTION, [ARGS]);
MAP.map(FUNCTION(value_in_array, index, array), ARGS);
* const listItes = people.map(person => <li>{person}</li>); 와 같이 JSX도 mapping할 수 있다.
* Key값은 변경할 수 없으며 유일해야 하지만, 다른 배열인 경우 같은 JSX node를 사용할 수 있다.
- filter()
: 주어진 함수를 통과하는 요소를 모아(true/false로 구분) 새로운 배열로 return
FILTER.filter(ARGS => EXPRESSION);
4) Purity
Pure함수는 수학 공식과 같은 함수를 일컫는데, 구체적으로 pure하다는 뜻은 다음과 같다.
1. 같은 argument에 대해서 항상 같은 return값을 갖는다.
: 즉, input stream, mutual reference, static, local변수 등에 구애받지 않는다.
2. 함수나 객체의 범위를 벗어나 변수를 변형시키지 않는다.
: rendering하면서 구성요소가 다른 변수나 input stream등의 값을 변경시키지 않는다.
이때, 같은 함수안에서 생성된 로컬 변수를 변경시키는 것은 허용하는데, 이를 local mutation이라고 한다.
"왜 pure한 함수를 사용해야 하는가?"
: 함수가 항상 같은 환경에서 실행되지 않으므로(서버 등), 동일 입력에 대해 동일 결과를 반환하는 하나의 구성요소가 많은 사용자 요청을 처리할 수 있다. rendering은 언제든 실행될 수 있으므로 서로의 rendering sequence에 의존하면 안된다.
또한 시간을 낭비하지 않을 수 있다. deep component tree에서 rendering 되는 중 data가 변경되면, pure한 함수는 언제든지 계산을 중지해도 다른 변수를 변경시키지 않아 기존 rendering을 기다리지 않고 새로 시작해도 문제가 없다.
'개발 > React' 카테고리의 다른 글
React - 6) To-Do List ~ Local Storage (0) | 2022.07.01 |
---|---|
React - 5) To-Do List (0) | 2022.06.30 |
React - 4) State (0) | 2022.06.24 |
React - 3) Interactivity (0) | 2022.06.24 |
React - 1) React 환경설정 (0) | 2022.06.23 |