FRONT-END/REACTJS

JSX 문법

JINGMONG 2021. 12. 18. 02:34

감싸인 요소

컴포넌트에 여러 요소가 있다면 반드시 부모 요소 하나로 감싸야 함

function App() {
  return (
    <h1> 리액트 </h1>
    <h1> 안녕!! </h1>
  )
}

export default App;

와 같이 요소들을 하나로 감싸지 않으면 안됨

function App() {
  return (
    <div>
      <h1> 리액트 </h1>
      <h1> 안녕!! </h1>
    <div>	
  )
}

export default App;

와 같이 부모 요소 하나로 감싸야 함

why?

Virtual DOM에서 컴포넌트 변화를 감지해 낼 때 효율적으로 비교할 수 있도록 컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 한다는 규칙

리액트 v16이상부터는

<div> 대신 <Fragment>라는 기능을 사용하면 됨

import { Fragment } from 'react';

function App() {
  return (
    <Fragment>
      <h1> 리액트 </h1>
      <h1> 안녕!! </h1>
    </Fragment>	
  )
}

export default App;

또는

function App() {
  return (
    <>
      <h1> 리액트 </h1>
      <h1> 안녕!! </h1>
    </>	
  )
}

export default App;

로 표현

자바스크립트 표현

JSX 안에서는 자바스크립트 표현식을 사용할 수 있음

JSX 내부에서 { }로 감싸서 사용

function App() {
  const name = "리액트";
  return (
    <>
      <h1> {name} </h1>
      <h1> 안녕!! </h1>
    </>
  );
}

export default App;

if문 대신 조건부 연산자

JSX 내부의 자바스크립트 표현식에서 if문을 사용할 수는 없다

조건에 따라 다른 내용을 랜더링해야 할 때는 JSX 밖에서 if 문을 사용하여 사전에 값을 설정하거나, { } 안에 조건부 연산자를 사용하면 된다

조건부연산자 = 삼항연산자

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

export default App;

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

특정 조건을 만족할 때 내용을 보여주고, 만족하지 않을 때 아무것도 렌더링 하지 않아야 한다면 조건부 연산자를 통해 구현

function App() {
  const name = "리액트";
  return (
    <>
      {name === "리액트" && <h1> 리액트 입니다. </h1>}
      <h1> 안녕!! </h1>
    </>
  );
}

export default App;

리액트에서 false를 렌더링할 때는 null과 마찬가지로 아무것도 나타나지 않기 때문

하지만 null이 아닌 0은 렌더링 됨

undifined를 렌더링하지 않기

리액트 컴포넌트에서는 함수에서 undefined만 반환하여 렌더링하는 상황을 만들면 안된다

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

export default App;

은 오류를 발생시킨다.

어떤 값이 undefined일 수도 있다면 OR( || ) 연산자를 사용하면 해당 값이 undefined일 때 사용할 값을 지정할 수 있다

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

export default App;
function App() {
  const name = undefined;
  return <div> { name } </div>;
}

export default App;

처럼 JSX내부에 undefined를 렌더링 하는 것은 괜찮다.

인라인 스타일링

리액트에서 DOM 요소에 스타일을 적용할 때는 문자열 형태로 넣는 것이 아니라 객체 형채로 넣어 주어야 한다. 스타일 요소중 - 로 연결된 것은 카멜 표기법으로 작성해야한다.

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

export default App;

class 대신 className

일반 HTML에서 CSS 클래스를 사용할 때는 <div class="myclass"></div>와 같이 class라는 속성을 설정하지만 JSX에서는 class가 아닌 className으로 설정해 주어야 한다

App.css

.react {
  background: aqua;
  color: black;
  font-size: 48px;
  font-weight: bold;
  padding: 16px;
}

App.js

import "./App.css";

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

export default App;

꼭 닫아야 하는 태그

HTML 코드를 작성할 때 가끔 태그를 닫지 않은 상태로 코드를 작성하기도 한다

input 태그는 <input></input>이라 쓰지 않고 <input>만 써도 작동한다

하지만 JSX에서는 태그를 닫지 않으면 오류가 발생한다.

import "./App.css";

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

export default App;

주석

import "./App.css";

function App() {
  const name = "리액트";
  return (
    <>
      {/* 주-------석 */}
      <div
       className="react" // 이렇게도 작성 가능
      >
        { name }
      </div>
      <input />
      // 이런거나
      /* 이런건 안됨 */
    </>
  );
}

export default App;

'FRONT-END > REACTJS' 카테고리의 다른 글

props  (0) 2021.12.19
컴포넌트  (0) 2021.12.19
JSX  (0) 2021.12.18
리액트 프로젝트 생성하기  (0) 2021.12.17
작업 환경 설정  (0) 2021.12.17