항해99 이번 주차에 팀과제로 진행한 개념정리문
노션링크 - https://teamsparta.notion.site/React-2-e21a43014e924ad487369fda21d6f205
Q
자바스크립트에서 유사배열과 배열의 차이는 무엇일까요?
유사배열의 각 요소를 수정하고 싶다면 어떤 과정을 거쳐야할까요?
유사 객체 배열은 배열처럼 보이지만 사실 key가 숫자이고 length 값을 가지고 있는 객체를 말한다. JS에서 querySelectorAll이나 document.body.children으로 엘리먼트를 가져오면 유사 배열 객체에 담겨서 온다.
Q
event listener는 등록되면 반드시 해제되어야 합니다.
클래스형 컴포넌트에서는 컴포넌트가 화면에서 사라질 때(unmount 될 때) event listener를 해제합니다. (componentWillUnmount에서요!)
그럼 라이프사이클 메소드를 사용할 수 없는 함수형 컴포넌트에서는 event listener를 해제할 때 어떻게 해야할까요?
이벤트 리스너는 DOM객체에서 이벤트가 발생할 경우 해당 이벤트 처리 핸들러를 추가할 수 있는 오브젝트이다.
이벤트 리스너를 이용하면 특정 DOM에 위에서 말한 Javascript 이벤트가 발생할 때 특정 함수를 호출한다.
이벤트 리스너의 경우 웹 애플리케이션 메모리 누수의 원인이 될 수 있다. 더 이상 해당 이벤트 리스너가 필요 없다고 하면 반드시 추가된 이벤트 리스너는 반드시 삭제해주어야 한다.
그럼 라이프 사이클 메서드를 사용할 수 없는 함수형 컴포넌트에서는 어떻게 event를 실행시기고 해제해야할까?
함수형 컴포넌트에서는 각각의 라이프사이클 메소드를 useEffect
하나로 통일시킬 수 있다. 대신 dependency를 선언하여 시점을 구분한다.
useEffect(() => {
console.log('hi')
}, [/* dependency 선언하는 곳 */])
빈 배열을 선언하면 최초 로드시에만 렌더링이 된다.
useEffect를 이용해서 최초 로드 시에 addEventListener를 사용하여 이벤트를 추가해주면 이벤트 감지가 시작된다.
useEffect(() => {
document.addEventListener();
}, [])
이벤트를 등록하고 난 뒤 성능 저하를 방지하기 위해 컴포넌트가 언마운트 될 때 꼭 이벤트 등록을 해제해주어햐 한다. 함수형 클래스에서는 useEffect
의 내부 함수의 return값으로 removeEventListener를 통해 해제해주면 된다.
Q
리액트에서는 DOM 요소에 접근하기 위해 주로 ref를 씁니다.
domcument.getElementsByClassName 등을 쓰는 게 아니라 ref를 쓰는 이유는 무엇일까요?
일반 HTML에서 DOM요소에 이름을 달 때는 id를 사용는데 리액트 프로젝트 내부에서 DOM에 이름을 다는 방법이 ref 이다. ref를 사용하는 시기는 DOM 을 꼭 건드려야 할 때 사용하며
° 특정 input에 포커스 주기
° 스크롤 박스 조작하기
° Canvas 요소에 그림 그리기등
위와 같은 경우에는 어쩔 수 없이 DOM에 직접적으로 접근해야한다.리액트 공식 문서에 보면
선언적으로 해결될 수 있는 문제에서는 ref 사용을 지양해야한다.
ref의 사용을 최대한 줄여야 한다고 명시되어있다.
대충 ref에 대한 설명을 하였고 사용하는 이유는?
id는 유일해야 하지만 컴포넌트 재사용을 한다면 중복될 가능성이 있다.
ref는 전역적으로 작동하지 않고 컴포넌트 내부에서만 작동한다.
하지만 리액트에서도 id를 사용할 수는 있다👍
Q
SPA 방식과 MPA 방식은 무엇인가요?
SPA(Single Page Application)는 한 개(single)의 Page로 구성된 application 이고,
MPA(Multi Page application)는 여러 개(multi)의 Page로 구성된 application 이다.
MPA
는 새로운 페이지를 요청할 때마다
정적 리소스가 다운로드 되고,그에 맞춰 전체 페이지
를 다시 렌더링
한다.인터넷 주소창에 주소를 입력하거나, 링크를 클릭하는 등 사용자가 어떤 요청을 하면,그에 맞는 html, 이미지 등의 파일들이 전부 다운로드 되고 다시 렌더링 된다.
반면 SPA
는 웹 애플리케이션에 필요한 모든 정적 리소스를 최초
한번에
다운로드한다.그 이후 새로운
페이지 요청
이 있을 경우,페이지 갱신에 필요한 데이터만
전달받아 페이지를 갱신
한다.어떤 링크를 클릭한다고 해서 그에 관련된 모든 파일을 다운받는게 아니라,필요한 정보만 받아서 그 정보를 기준으로 업데이트 될 뿐이다.
Q
element(엘리먼트)란?
리액트에서 가장 작은 단위이며, 화면에 표시할 내용을 기술하는 것을 말함
쉽게 생각하면, 엘리먼트는 컴포넌트의 구성 요소이고,
반대로 컴포넌트를 엘리먼트로 구성되어 있다고 생각 할 수 있다
ex) const element = <span>hello</span>;
어떻게 사용할까 ?
React 엘리먼트를 루트 DOM 노드에 렌더링하려면 ReactDOM.render()로 전달하면 된다.
ex)
const element = <h1>hello, GodDaeHee!~</h1>;
ReactDOM.render(element, document.getElementById('root'));
위와 같은 원리로 엘리먼트를 생성하고 렌더링 하는데,
JSX를 사용한다면 이 작업을 바벨이 편하게 알아서 해석 해주게 된다.
Q
props란?
프로퍼티, props(properties의 줄임말) 이며,
상위 컴포넌트가 하위 컴포넌트로 값을 전달할때 사용 한다
(단방향 흐름 데이터 흐름을 가지며 하위 컴포넌트에서 읽기전용이다)
어떻게 사용할까?
프로퍼티에 문자열을 전달할 때는 큰따옴표(" ")를,
문자열 외의 값을 전달할 때는 중괄호({ })를 사용 한다.
ex )
props={} , props=""
참고할 만한 사용법
프로퍼티의 자료형을 미리 선언할 수 있다
ex)
Main.propTypes = { name: PropTypes.string }
컴포넌트에 props 기본값을 설정하고 싶은 경우 defaultProps를 설정하면 된다.
ex)
Main.defaultProps = { name: '디폴트' }
디폴트 설정을 하지 않는 경우 해당 프로퍼티를 필수 프로퍼티로 선언 할 수도 있다.
ex)
Main.propTypes = {name: PropTypes.string.isRequired, }
Q
JSX란?
JSX 사용하기
JSX변환방법
JSX 장점
JSX 특징
JSX문법
<div>, <p>, <span>, <a>
같이 짝이 있는 태그의 경우 반드시 닫는 태그가 존재해야 한다. 그렇지 않을 경우 에러가 발생한다.<img/>, <input/>, <br/>
같은 단독 태그(self-closing tag)의 경우에는 반드시 태그를 닫아줘야 한다. 그렇지 않을 경우 에러가 발생한다.(JSX는 자식 엘리먼트를 가질 수 있다.)
Point
state는 일반 자바스크립트 객체고, 함수 내부에 선언된 변수처럼 컴포넌트 내부에서 사용됩니다.
- state는 일반 자바스크립트 객체고, 함수 내부에 선언된 변수처럼 컴포넌트 내부에서 사용된다
- 일반적으로 컴포넌트 내부에서 변경이 가능한 데이터를 관리할 때 사용한다.
- state는 렌더링 되는 결과물에 영향을 미치는 요소 중 하나고, 기본적으로 state에 변경이 생기면 컴포넌트는 리렌더링 된다.
- state는 사용자와의 interaction이나 네트워크 변경 이벤트의 결과로 변경된다.
- state 값을 변경하기 위해선 state 자체의 값을 변경하는 것이 아니라 setState() 함수를 사용해서 변경해야한다.
Q
컴포넌트(Component)란?
- 리액트로 만들어진 앱을 이루는 최소한의 단위
기존의 웹 프레임워크는 MVC방식으로 분리하여 관리하여 각 요소의 의존성이 높아 재활용이 어렵다는 단점이 있었다. 반면 컴포넌트는 MVC의 뷰를 독립적으로 구성하여 재사용을 할 수 있고 이를 통해 새로운 컴포넌트를 쉽게 만들 수 있다. - 컴포넌트는 데이터(props)를 입력받아 View(state) 상태에 따라 DOM Node를 출력하는 함수. - 컴포넌트 이름은 항상 대문자로 시작하도록 한다. (리액트는 소문자로 시작하는 컴포넌트를 DOM 태그로 취급하기 때문이다.
UI를 재사용 가능한 개별적인 여러 조각으로 나누고, 각 조각을 개별적으로 나누어 코딩한다.
“props”라고 하는 임의의 입력을 받은 후, 화면에 어떻게 표시되는지를 기술하는 React 엘리먼트를 반환한다.
props와 state 등의 특징들은 따로 정리 하도록 한다.
1) 함수형 컴포넌트 (Stateless Functional Component) - 가장 간단하게 컴포넌트를 정의하는 방법은 자바스크립트 함수를 작성하는 것이다. - 하기 예시의 export는 구문은 작성한 MyComponent 파일을 다른 파일에서 import 할때 MyComponent로 불러올 수 있도록 정의해 주는 부분이다.
- 컴포넌트 구성 요소, 리액트 생명주기를 모두 포함하고 있다. (리액트 생명주기는 따로 조금더 자세히 알아보도록 한다.)
Q
Hook이란?
const [state, setState] = useState()
형태로 사용한다.useEffect(effect, [, deps]);
형태로 사용되는데, 첫번째 인자(effect)는 함수, 두번째 인자는 배열(deps)이 들어간다.