2.1 코드 이해하기

create-react-app은 번들러(웹팩, Parcel browserify) 중 웹팩을 사용하는 프로젝트를 생성함.

이로 인해,

- import 구문을 사용해서 모듈 통합이 가능함.

- 최적화 과정에서 파일 분리가 가능함.

- 로더를 통해서 svg, css, 웹폰트, 미디어 파일 등을 불러와서 사용할 수 있음.

- 최신 자바스크립트 파일을 ES5문법으로 변환해줌.

 

2.2 JSX란?

자바스크립트의 확장 문법이며 XML과 유사. 번들링 과정에서 일반 자바스크립트 형태의 코드로 변환됨.

1.번들링 전
function App() {
	return (
    	<div>
        	Hello <b>react</b>
        </div>
    );  
}

2.번들링 후
function App() {
	return React.createElement("div", null, "Hello", React.createElement("b", null, "react")));
}

 

2.3 JSX의 장점

- 보기 쉽고 익숙하다. (html과 유사)

- 활용도가 높다. (html 태그뿐만 아니라, 새로 만드는 컴포넌트도 JSX안에서 작성 가능)

 

2.4 JSX 문법

2.4.1 감싸인 요소

- 부모 요소 하나로 감싸야함. (Virtual DOM에서 컴포넌트 변화를 감지해 낼 때 효율적으로 비교할 수 있도록 하는 컴포넌트 내부는 하나의 DOM트리 구조로 이 류어 져야 한다는 규칙 존재)

1.잘못된 예
import React from 'react';

function App() {
	return (
    	<h1>리액트 안녕!</h1>
        <h2>잘 작동하니?</h2>
	)
}

export default App;

2.올바른 예
import React from 'react';

function App() {
	return (
		<div>
			<h1>리액트 안녕!</h1>
			<h2>잘 작동하니?</h2>    
		</div>
	)
}

export default App;

3.v16이상 Fragment 사용 가능
import React, {Fragment} from 'react';

function App() {
	return (
		<Fragment>
			<h1>리액트 안녕!</h1>
			<h2>잘 작동하니?</h2>    
		</Fragment>
	)
}

export default App;

4.Fragment를 아래와 같은 형태로도 사용 가능
import React, {Fragment} from 'react';

function App() {
	return (
		<>
			<h1>리액트 안녕!</h1>
			<h2>잘 작동하니?</h2>    
		</>
	)
}

export default App;

 

2.4.2 자바스크립트 표현

JSX 내부에서 자바스크립트 표현식을 사용하려면 {}를 사용

import React from 'react';

function App() {
	const name = '리액트';
	return (
		<>
			<h1>{name} 안녕!</h1>
			<h2>잘 작동하니?</h2>    
		</>
	)
}

export default App;

 

2.4.3 If문 대신 조건부 연산자

JSX 내부의 자바스크립트 표현식에서 if문 사용 불가. 때문에 JSX밖에서 if문을 사용하여 사전에 값을 설정하거나, { }안에 조건부 연산자(삼항 연산자)를 사용

import React, {Fragment} from 'react';

function App() {
    const name = '리액트';
    return (
        <div>
            {name === '리액트' ? (
                <h1>리액트 안녕!</h1>
            ) : (
                <h2>잘 작동하니?</h2>
            )}
        </div>
    )
}

export default App;

2.4.4 AND 연산자(&&)를 사용한 조건부 렌더링

특정 조건을 만족할 때만 내용을 보여줄 때 사용.

1.null을 렌더링
import React from 'react';

function App() {
    const name = '뤼액트';
    return (
        <div>{name === '리액트' ? <h1>리액트 입니다.</h1> : null}</div>
    )
}

export default App;

2.false를 렌더링 하는 경우 null과 마찬가지로 취급(0은 예외적으로 화면에 나타남)
import React from 'react';

function App() {
    const name = '뤼액트';
    return (
        <div>{name === '리액트' && <h1>리액트 입니다.</h1>}</div>
    )
}

export default App;

2.4.5 undefined를 렌더링하지 않기

1.함수에서 undefine만 반환하여 랜더링할 수 없음
import React from 'react';

function App() {
    const name = undefiend;
    return name;
}

export default App;

2.OR연산자를 통한 해결
import React from 'react';

function App() {
    const name = undefiend;
    return name || '값이 undefined 입니다.';
}

export default App;

3.JSX내부에서 undefined 랜더링 가능
import React from 'react';

function App() {
    const name = undefiend;
    return <div>{name}</div>;
}

export default App;

2.4.6 인라인 스타일링

- DOM요소에 스타일을 적용할 때 객체 형태로 넣어 주어야 함. (문자열 x)

- 카멜표기법으로 작성해야 함 (background-color ==> backgroundColor)

1.객체를 선언하여 전달
import React from 'react';

function App() {
    const name = '리액트';
    const style = {
        backgroundColor: 'black',  //background-color => backgroundColor
        color: 'aqua', 
        fontSize: '48px', //font-size => fontSize
        fontWeight: 'bold', //font-weight =>fontWeight
        padding: 16
    }
    return (
        <div style={style}>{name}</div>
    )
}

export default App;

2.inline 형태로 전달 시
import React from 'react';

function App() {
    const name = '리액트';
    return (
        <div style={{
            backgroundColor: 'black',
            color: 'aqua',
            fontSize: '48px',
            fontWeight: 'bold',
            padding: 16
        }}>{name}</div>
    )
}

export default App;

2.4.7 class대신 className

JSX에서는 class가 아닌 className으로 class 지정.

(v16이상부터는 class로 지정하면 className으로 변환시켜 주고 콘솔에 경고 띄움._

import React from 'react';

function App() {
    const name = '리액트';
    return (
        <div className="react">{name}</div>
    )
}

export default App;

2.4.8 꼭 닫아야 하는 태그

태그는 꼭 닫아야 함

ex> <input> (x), <input></input>, <input/> (o)

2.4.9 주석

JSX 내부에서 주석을 작성할 때는 {/* !@#!@#!#  */}와 같은 형식으로 작성

import React, {Fragment} from 'react';

function App() {
    const name = '리액트';
    return (
        <>
            {/*주석은 이렇게 작성합니다*/}
            <div 
                className="react" //시작 태그를 여러 줄로 작성하게 된다면 여기에 가능.
            >
                {name}
            </div>
            // 하지만 이런 주석이나
            /*이런 주석은 페이지에 그대로 나타나게 됨*/
        </>
    )
}

export default App;

2.5 ESLint와 Prettier 적용하기

- ESLint : 문법 검사도구, 잘못된 문법 시 경고 메시지 화면에 보임. (VS Code : 보기 > 문제 (상단 메뉴))

- Prettier : 코드 스타일 자동 정리 도구 (VS Code : f1 -> format document), 루트 디렉터리에 .prettierrc를 작성해서 커스터마이징

- 저장할 때 코드 자동 정리 :  Code(파일) > 기본 설정 > 설정 (상단메뉴) 에서 텍스트 박스에 format on save 검색하여 체크. 

 

2.6 정리

JSX는 HTML과 비슷하지만 완전히 똑같지 않음. 코드로 보면 XML 형식이지만 실제로는 자바스크립트 객체이며, 용도와 문법이 조금씩 차이가 남.

'개발 도서 > 리액트를 다루는 기술(개정판)' 카테고리의 다른 글

5장 ref:DOM에 이름 달기  (0) 2020.05.23
4장 이벤트 핸들링  (0) 2020.05.22
3장 컴포넌트  (0) 2020.05.17
1장 리액트 시작  (0) 2020.05.16
목차  (0) 2020.05.16

+ Recent posts