본문 바로가기

유튜브관련/리액트입문(멤버십용)

[React강좌] 5강 JSX문법 - 7가지 규칙 - 오쌤의 니가스터디

728x90
반응형

 

 

 

 

 

 

 

 

 

1. JSX란?


## 정의

- JavaScript XML의 약자입니다.

- 리액트에서 UI를 표현할 때 쓰는 문법입니다.

- 자바스크립트의 확장문법, XML과 매우 비슷하게 생겼습니다.

- JSX를 반드시 사용해야 하는 것은 아니지만 JSX를 사용하면 React 애플리케이션을 더 쉽게 작성할 수 있습니다.

 

 

 

## 변환

- 브라우저에서 실행되기 전에 바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환됩니다.

 

 

 

## 장점

- HTML코드 작성과 비슷하기 때문에 보기 쉽고 익숙합니다.

- 컴포넌트들도 HTML 태그를 쓰듯이 그냥 작성하여 활용도가 높습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. JSX문법


- JSX문법을 자손 컴포넌트에 저장 후 [index.js]로 불러오겠습니다.

 

## index.js 코드

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import 컴포넌트명 from '컴포넌트경로';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <컴포넌트명 />
  </React.StrictMode>
);

reportWebVitals();

 

 

 

 

 

1) 꼭 태그는 최상위 태그로 감싸줘야 합니다. 

- 요소를 반드시 하나의 요소로 묶어야 합니다.

 

## <div> 태그로 감싸기 - JSX01_1.js

import React from 'react';

function JSX01_1() {
    return (
        <div>
            <h1>안녕하세요!</h1>
        </div>
    );
};

export default JSX01_1;

- div로 크게 묶는 것도 한 가지 방법이지만 결국 <div> 태그로 인식하기 때문에 스타일링에 문제가 생길 수 있습니다.

- [VS Code]에서 [Reactjs Code Snippets]를 설치해서 [rsf]를 누르면 기본으로 나오는 방식이기도 합니다. 

 

 

 

## 그냥 작성해보기 - JSX01_1.js

import React from 'react';

function JSX01_1() {
    return (
        <h1>안녕하세요!</h1>
    );
};

export default JSX01_1;

- 틀렸다고 나오지는 않습니다. 하지만 큰 블록으로 나오는 것을 추천합니다.

- 실제로 태그가 정말 한개라면 return에 괄호를 작성하지 않아도 됩니다. 

return <h1>안녕하세요</h1>; //맞는코드

- 컴포넌트도 객체입니다. return 키워드로 코드를 반환시 객체 방식으로 여러 개일 때 괄호를 묶어 줍니다. 

 

 

 

 

 

## <></>를 사용하기 - JSX01_2.js

import React from 'react';

function JSX01_2() {
    return (
        <>
            <h1>안녕하세요!</h1>
        </>
    );
};

export default JSX01_2;

- 이와 같은 방법을 사용하면 스타일링에도 문제가 없고, Fragment를 불러오지 않으니 무겁지도 않습니다.

 

 

## <Fragment>태그로 감싸기 - JSX01_3.js

import React from 'react';

function JSX01_3() {
    return (
        <Fragment>
            <h1>안녕하세요!</h1>
        </Fragment>
    );
};

export default JSX01_3;

- <Fragment>를 사용하기도 합니다. 하지만 <div> 태그보다 무거워서 권장하지 않습니다.

- <Fragment>를 사용하니 첫번째 줄에 자동으로 위에 import 되는 것을 확인할 수 있습니다. 

 

 

 

## 에러인 경우1 - JSX01_4.js

import React from 'react';

function JSX01_4() {
    return (
        <h1>안녕하세요?</h1>
        <h1>안녕하세요?</h1>
    );
};

export default JSX01_4;

- 태그가 2개인데 묶지 않고 사용했습니다. 이런 경우는 에러가 발생합니다.

이렇게 브라우저 화면에도 에러가 발생됩니다.

- 리액트 구문은 하나라도 틀리면 바벨이 compile 해주지 않습니다.

 

 

 

## 에러인 경우2 - JSX01_5.js

import React from 'react';

function JSX01_5() {
    return (
        <div>안녕하세요?</div>
        <div>안녕하세요?</div>
    );
};

export default JSX01_5;

- 최상위 태그로 사용하는 <div>는 괜찮을까 하고 써봤지만 역시 오류입니다.

- 태그들을 무조건 컴포넌트 한개당 최상위 태그로 하나로 묶어줘야 합니다.

역시 브라우저에서 에러가 발생됩니다.


 

 

 

 

 

 

 

 

 

 

 

2) 꼭 닫혀 있어야 하는 태그 문법

- 태그는 무조건 닫혀 있어야 합니다. 

- 일반태그들은 닫혀있지만, 종료태그가 없는 태그는 반드시 />를 처리해줘야 합니다.

 

 

## 에러1 - 종료태그를 안 쓰는 경우 - JSX02_1.js

import React from 'react';

//2. 꼭 닫혀 있어야 하는 태그 문법
function JSX02_1() {
    return (
        <>
            <h1>안녕하세요!
        </>
    );
};

export default JSX02_1;

역시 브라우저에서 오류가 납니다.

- 반드시 [<h1>안녕하세요?</h1>]로 작성해야 합니다.

 

 

 

 

## 에러 2 - 종료태그가 없는 태그 - JSX02_2.js

import React from 'react';

//2. 꼭 닫혀 있어야 하는 태그 문법
function JSX02_2() {
    return (
        <>
            <label for="loginid">아이디입력: </label>
            <input type="text" id="loginid">
        </>
    );
};

export default JSX02_2;

역시 브라우저에서 에러가 발생됩니다.

- JSX는 HTML이 아니다!라고 인식하시면 편합니다. 새로 나온 리액트의 문법입니다.

 

 

 

 

## 에러 없이 작성 - JSX02_3.js

import React from 'react';

//2. 꼭 닫혀 있어야 하는 태그 문법
function JSX02_3() {
    return (
        <>
            <label for="loginid">아이디입력: </label>
            <input type="text" id="loginid" />
            <label for="loginpass">비밀번호입력: </label>
            <input type="password" id="loginpass"></input>
        </>
    );
};

export default JSX02_3;
<태그명 />

<태그명></태그명>

- 종료가 없는 태그라 하더라도, 반드시 닫히게 작성해줘야 합니다. 

- 위에서도 말했듯이 JSX는 HTML이 아니다!라고 인식하시면 편합니다. 새로 나온 리액트의 문법입니다.

 


 

 

 

 

 

 

 

 

 

 

3) JSX의 표현식 - { }

- 컴포넌트는 UI를 구현하는 것 이외에도 여러 가지 기능을 합니다.

- 그중 하나가 자바스크립트로 값을 처리하는 것입니다.

- { } 내부에는 변수, 속성 또는 기타 유효한 JavaScript 표현식을 작성할 수 있습니다.

 

 

 

## 수식 사용하기 (더하기 연산) - JSX03_1.js

import React from 'react';

function JSX03_1() {
    return (
        <div>
            <h1>5 + 5 = { 5 + 5 }</h1>
        </div>
    );
};

export default JSX03_1;

- 밖에 쓴 5 + 5는 텍스트콘텐츠로 그대로 출력이 되고, { } 중괄호 내부에 쓴 것은 수식으로 계산되어집니다. 

브라우저에 10이라고 연산이 잘되어 있죠?

 

 

 

 

## 변수 참조 - JSX03_2.js

import React from 'react';

function JSX03_2() {
    const userName = '홍길동';

    return (
        <div>
            <h1>환영합니다. { userName } 님!!!</h1>
        </div>
    );
};

export default JSX03_2;

- return 밖에 const로 userName이라는 변수를 선언하고 홍길동이라고 값을 담았습니다.

- 그리고 JSX에서 { } 내부에 변수명을 작성했습니다.

- JSX는 return안에 작성하기 때문에 그 밖에는 자바스크립트 언어를 작성해도 됩니다.

그럼 브라우저에 홍길동이라고 잘 표현됩니다. 변수값이 바뀌면 브라우저 값도 바뀝니다.

 

 

 

 

## 자바스크립트 표현식 작성 - JSX03_3.js

import React from 'react';

function JSX03_3() {
    return (
        <div>
            { alert('안녕하세요?!?') }
        </div>
    );
};

export default JSX03_3;

- { } 중괄호 내부에 바로 자바스크립트 구문을 작성했습니다.

- { }의 마지막에는 [;]을 작성하면 오류가 있으니 주의해 주세요.

 

자바스크립트의 경고창이 바로 실행되는 것이 보입니다.

 


 

 

 

 

 

 

 

 

 

 

 

4) JSX의 { } 안의 주석은 /* */만 사용 가능

## JSX밖의 주석 - return문 밖 - JSX04_1.js

import React from 'react';

function JSX04_1() {
    /* 두줄 주석 사용 중 */
    const userName = '홍길동'; //한줄 주석 사용 중

    return (
        <div>
            <h1>안녕하세요. { userName }님!!!</h1>
        </div>
    );
};

export default JSX04_1;

- 오류가 전혀 없는 것을 확인할 수 있습니다.

 

 

 

## JSX안의 한 줄주석 - return문 안 - JSX04_2.js

import React from 'react';

function JSX04_2() {
    const userName = '홍길동'; 

    return (
        <div>
            <h1>안녕하세요. { userName //주석사용중 }님!!!</h1>
        </div>
    );
};

export default JSX04_2;

- { } 중괄호 내부에 한줄 주석을 사용했더니 에러가 뜨는 것이 확인됩니다.

브라우저에 에러가 발생된 것이 확인 됩니다.

 

 

 

 

 

## JSX안의 여러 줄주석 - return문 안 - JSX04_3.js

import React from 'react';

function JSX04_3() {
    const userName = '홍길동'; 

    return (
        <div>
            <h1>안녕하세요. { userName /* 여러줄 주석 사용 중 */ }님!!!</h1>
        </div>
    );
};

export default JSX04_3;

- 에러가 없는 것을 확인할 수 있습니다. 


 

 

 

 

 

 

 

 

 

 

 

 

 

5) 조건부 렌더링

## 삼항연산자 문법

(조건식)?(참표현식):(거짓표현식)

- ( ) 괄호는 없어도 됩니다.

 

 

 

## 삼항연산자를 이용한 JSX문법 - JSX05_1.js

import React from 'react';

function JSX05_1() {
    const score = prompt('숫자를 입력하세요','0~100사이 정수입력'); 

    return (
        <div>
            {
                (score>=80)
                ?(<h1>합격</h1>)
                :(<h1>불합격</h1>)
            }
        </div>
    );
};

export default JSX05_1;

- 변수에 prompt함수로 값을 입력받습니다.

- 점수가 80점 이상이면 합격이고 그렇지 않으면 불합격으로 처리할 겁니다. 

alert나 prompt가 자꾸 2개가 뜹니다 .

- 이런 현상이 발생하는 이유는 React.StrictMode 때문입니다.

- CRA로 생성된 리액트 프로젝트는 자동으로 설정되어 있기 때문에 발생하게 되는 것입니다.
- 리액트 공식 문서에도 명시되어 있습니다.

 

 

## index.js 변경

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import JSX05_1 from './JSX05_1';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <JSX05_1 />
);

reportWebVitals();

- 하단에 보이는 [ <React.StrictMode> ] 들을 지우면 됩니다. 

root.render(
  <React.StrictMode>
    <JSX05_1 />
  </React.StrictMode>
);

 

 

 

 

 

 

## 짧은 조건문 문법

(조건식)&&(참표현식)
(조건식)||(거짓표현식)

- ( )는 없어도 됩니다.

 

 

 

## 짧은 조건문을 이용한 JSX문법 - JSX05_2.js

import React from 'react';

function JSX05_2() {
    const score = prompt('숫자를 입력하세요','0~100사이 정수입력'); 

    return (
        <div>
            {
                (score>=80)&&(<h1>합격</h1>)
            }
        </div>
    );
};

export default JSX05_2;

- true인 경우만 처리했습니다. 

 

- 결과를 보면 80점 이상일 때만 합격, 그 이외는 결과가 나오지 않습니다. 

 

 

 

 

## 즉시실행함수 - 함수형

(function(){

})();

 

 

## 즉시실행함수 - 화살표함수형

(() => {

})();

 

 

## 즉시실행함수를 이용한 if문렌더링 - JSX05_3.js

import React from 'react';

function JSX05_3() {
    const score = prompt('숫자를 입력하세요','0~100사이 정수입력'); 

    return (
        <div>
            {
                (() => {
                    if(score >= 80){
                        return (<h1>합격</h1>);
                    }else{
                        return (<h1>불합격</h1>);
                    }
                })()
            }
        </div>
    );
};

export default JSX05_3;

- { } 내부에 바로 쓴 즉시실행함수에는 세미콜론 ; 을 사용하면 안 됩니다.

- 하지만 즉시 실행함수 내부에 쓴 if문 내부에는 세미콜론을 써도 틀리지 않습니다.

- { } 이것은 표현식으로 JSX문법이라 그렇습니다. 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

6) JSX 스타일링

## 태그문법에 스타일링

<태그명 style={{ 속성명: 값 }}></태그명>

- JSX에서 자바스크립트 문법을 쓰려면 { }를 써야 합니다.

- 거기에 스타일 속성명과 값을 적으려면 객체방식으로 써야겠죠?

- 그래서 {{ }} 중괄호가 두 번 들어가는 문법을 사용합니다.

 

 

 

# JSX문법 작성 - JSX06_1.js

import React from 'react';

function JSX06_1() {
    return (
        <div>
            <h1 style={{
                color: 'pink',
                backgroundColor: 'black'
            }}>
                제목태그
            </h1>
        </div>
    );
};

export default JSX06_1;

- 스타일이 잘 적용되는 것이 확인됩니다. 

 

 

 

 

## 변수에 담고 스타일에 적용 - JSX06_2.js

import React from 'react';

function JSX06_2() {
    const h1Style = {
        backgroundColor: 'black',
        color: 'pink'
    }

    return (
        <div>
            <h1 style={ h1Style }>
                제목태그
            </h1>
        </div>
    );
};

export default JSX06_2;

 

- 스타일이 잘 적용되는 것이 확인됩니다. 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

7) 외부 스타일시트의 class 가져오기

## [class] 속성을 [className] 속성으로 처리

<태그명 className="클래스명"></태그명>

- JSX는 HTML이 아닌 것을 이해하는 것이 중요합니다.

- JSX문법에서 class를 클래스선언으로 사용하기 때문에 class를 사용할 수 없어서 대체제로 나온 것입니다.

 

 

 

## 외부 CSS파일 만들기 - [test.css]

.h1Style{
    background-color: black;
    color: pink;
}

 

 

 

## 컴포넌트에 className  적용 - JSX07_1.js

import React from 'react';
import './test.css';

function JSX07_1() {
    return (
        <div>
            <h1 className="h1Style">제목태그</h1>
        </div>
    );
};

export default JSX07_1;

- import키워드로 css파일을 불러옵니다.

- 이때 JS가 아니므로 반드시 확장자를 써주세요.

- 태그 요소에는 [class] 대신 [className]을 써주세요. 

 

- 스타일이 잘 적용되는 것이 확인됩니다. 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형