You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
c.f. Vue.js에서는 v-if나 v-else 와 같이 프레임워크가 제공하는 directive(지시자)라는 것을 쓰는데, 이는 앵귤러에서 차용한 것이다.
React에서는 이보다는 보다 자바스크립트 용어를 사용하면서, interpolation 안에서 조건식을 사용하여 조건부 렌더링을 구현한다.
render함수 이전(클래스컴포넌트)이나 컴포넌트 함수몸체(함수 컴포넌트)에서 if/else 식으로 무언가를 처리할 수도 있지만 3항연산식과 nullish, optional chaining 등으로 컴포넌트 속 조건부 렌더링 조건식을 세워보자
리스트 렌더링
c.f. Vue.js에서는 v-for이라는 directive로 리스트를 처리할 수 있다.
React에서는 배열을 전달하면 알아서 자동으로 이를 순회하며 자식요소로 만들어주는데 이 때 배열 속에는 React element가 있어야.
db를 import해 렌더링해보자.
importdbfrom'./api/db.json';// 또는 최상단에 위치시키기 싫으면 const db = require('./api/db.json')으로도 가능하다. // 이는 webpack이 EMS or CommonJS 컴파일을 알아서 해주기 때문이다const{navigation: { items }}=db;constrenderList=list=>{returnnull||list.map({ link, text }=><li><ahref={link}>{text}</a></li>);}
이렇게 하면 key props를 지정하지 않았다는 경고가 콘솔에 찍힌다.
key props는 React가 list 렌더링 시 이전 컴포넌트와 최신 컴포넌트를 비교할 때 쓰는 id로, 고유한 값을 넣어주어야 React의 재조정 알고리즘이 정확하고 효율적으로 최적화를 할 수 있다.
list의 index를 넣으면 간편하겠지만, 이를 key로 넣었을 때는 재조정 알고리즘의 오묘한 문제 때문에 치명적인 결함을 갖는다.
첫 렌더링 때는 상관이 없는데, 배열의 경우 요소가 추가되는 등 index가 바뀌는 상황에서 컴포넌트 비교에 문제가 생긴다.
그러므로 index를 넣지 말고 각 item의 고유한 값을 넣어주도록 하자.
Compound Component
컴파운드 컴포넌트는 컴포넌트 안에 귀속된 컴포넌트.
컴포넌트는 함수이다. 함수는 객체이므로 그 안에 프로퍼티와 메서드를 가질 수 있다.
컴포넌트(함수)에 귀속된 컴포넌트(함수)를 통해 결합도를 높이고 서로 연관된 컴포넌트의 관계를 묶어둘 수 있다.
React.StrictMode는 리액트에서 제공하는 컴파운드 컴포넌트로, 개발 시 컴포넌트에서 발생한 오류를 콘솔에 친절하게 알려준다.
이렇게 하면 화살표함수라서 List.Item 컴포넌트가 warning을 띄운다. 이 때 List.Item.displayName = 'Item'로 이름을 적어줄 수도 있지만 더 간단하게는 그냥 일반 함수로 넣어주자.
List.Item=functionItem(props){
...
}
이제 이를 사용해보자.
// list라는 배열이 위에 선언되어 있다고 가정 exportfunctionApp(props){return<List>{list.map(({ link, text },index)=><List.Itemkey={index+text}link={link}text={text}/>)}</List>}
실습: 이를 활용하여 객체를 리스트 렌더링하되, 값이 string인 경우와 객체인 경우를 나누어 출력하도록 해보았다.
List의 Key props
재조정 알고리즘을 위해 old V-dom과 new V-dom을 비교할 때 필요하다.
이를 배열의 index로 넣으면 첫 렌더링에는 문제 없지만 배열의 index가 바뀌면 치명적인 문제가 생기니 unique한 id로 지정할 것
li뿐 아니라 컴포넌트 리렌더링을 고의로 유발할 때 사용할 수 있다. key 값이 변경되면 자동으로 컴포넌트가 리렌더링 되기 때문.
이는 한 번 렌더링한 컴포넌트를 브라우저 reload 없이 렌더링하고 싶을 때 유용.
진정한 CDD의 styling을 위한 webpack loader 설정
embedded style 로 css를 넣어주는 style-loader
index.html에서 모든 component의 style을 로드하면 CDD가 아니다.
각 component가 자기의 style을 가지고 있어야 CDD!
CDD에서는 과거 미덕처럼 여겨졌던 구조, 스타일링, 동작의 분리와 반대로 하나의 컴포넌트가 이 세가지를 다 가지고있다.
각 component의 js파일에서 css를 로드하자.
import './component.css'로 하면 되는데 당연히 오류가 난다.
css코드를 js에서 해석하지 못하기 때문이다. 이 때문에 css loader가 필요하다.
이렇게 해석한 css를 html 문서에 주입하기 위해 style loader도 필요하다.
style loader는 각 컴포넌트에서 import한 css 코드들을 html 문서의 head 태그의 embedded style 태그에 넣어준다.
$ npm i -D style-loader css-loader로 설정하고 웹팩을 구성하자.
webpack/config.dev.js에서 babel-loader 해준것과 같이 module > rules 밑에 css파일에 대해 로드해준다.