React - JSX, Rendering

이소라·2022년 7월 21일
0

React

목록 보기
1/23

JSX

  • JSX는 JavaScript의 확장 문법임
  • React로 프로젝트를 개발할 때 사용됨
  • JSX로 작성된 코드는 브라우저에서 실행되기 전에 코드가 번들링되는 과정에서 바벨을 사용해서 일반 JavaScript 형태의 코드로 변환됨
//jsx
function App() {
  return (
    <div>
      Hello <b>react</b>
    </div>
  )
}
function App() {
  return React.createElement("div", null, "Hello ", React.createElement("b", null, "react"));
}



JSX의 문법

감싸인 요소

  • 컴포넌트에 여러 요소가 있다면 반드시 하나의 부모 요소로 감싸야 함
    • 이유 : 컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 한다는 규칙 때문임 (Virtural DOM에서 컴포넌트 변화를 감지할 때 효율적으로 비교하기 위해서)
    • div 또는 fragment(<></>)로 감쌀 수 있음
function App() {
  return (
    <div>
      <h1>React</h1>
      <h2>JSX</h2>
    </div>
  )
}

export default App;

JavaScript 표현

  • JavaScript 표현식을 작성하려면 JSX 안의 코드를 {}로 감싸야 함
function App() {
  const greeting = 'hello';
  return (
    <div>
      <h1>{greeting} React</h1>
      <h2>JSX</h2>
    </div>
  )
}

export default App;

If 문 대신 조건부 연산자

  • JSX 내부의 JavaScript 표현식에서 if문 사용 불가능함
  • 조건에 따라 다른 내용을 랜더링하는 방법
    • JSX 밖에서 if문을 사용하여 사전에 값을 설정함
    • { } 안에 조건부 연산자(삼항 연산자)를 사용함
function App() {
  const name = 'React';
  return (
    <div>
      {name === 'React' ?
      (<h1>React입니다</h1>
      ):(<h1>React가 아닙니다</h1>)}
    </div>
  )
}

export default App;

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

  • 조건부 랜더링 : 특정 조건을 만족하면 내용을 보여주고, 만족하지 않으면 아무것도 랜더링하지 않음
    • && 연산자로 조건부 랜더링을 할 수 있는 이유 : React에서 false를 랜더링할 때는 null과 마찬가지로 아무젓도 나타나지 않기 때문에
function App() {
  const name = 'React';
  return (
    <div>
      {name === 'React' && <h1>React입니다</h1>}
    </div>
  )
}

export default App;

undefined를 랜더링하지 않기

  • React 컴포넌트에서는 함수에서 undefined만 반환하여 랜더링하면 안 됨
  • undefined 처리 방법
    • OR(||) 연산자를 사용하여 undefined일 때의 값을 설정함
    • JSX 내부에서 undefined를 랜더링함
function App() {
  const name = undefined;
  return name; // Error
}

// OR 연산자 사용
function App() {
  const name = undefined;
  return name || '값이 undefined입니다';
}

// JSX 내부에서 사용
function App() {
  const name = undefined;
  return <div>{name}</div>;
}

컴포넌트 자체를 숨기고 싶을 때는 null을 반환하기

  • 다른 컴포넌트에 의해 컴포넌트가 렌더링될 때 그 컴포넌트를 숨기고 싶다면 null을 반환하면 됨
function WarningBanner(props) {
  if (!props.warn) {
    return null;
  }

  return (
    <div className="warning">
      Warning!
    </div>
  );
}
  • 컴포넌트의 render 메서드로부터 null을 반환하는 것은 LifeCycle 메서드에 영향을 주지 않으므로 componentDidUpdate 메서드는 계속해서 호출됨

인라인 스타일링

  • React에서 DOM 요소에 스타일을 적용할 때는 객체 형태로 넣어 주어야 함
    • 스타일 이름 중 - 문자가 포함되어 있는 이름은 - 제거 후 카멜 표기법으로 작성해야함
function App() {
  const name = 'React';
  const style = {
    backgroundColor: 'black',
    color: 'aqua',
    fontSize: '48px',
    padding: 16 // 단위를 생략하면 px로 지정됨
  }
  return <div style={style}>{name}</div>;
}

export default App;
  • 스타일을 미리 선언하지 않고 바로 style 값을 지정하고 싶은 경우 JSX 내부에서 객체 형대로 작성함
function App() {
  const name = 'React';
  return <div style={{
    backgroundColor: 'black',
    color: 'aqua',
    fontSize: '48px',
    padding: 16
  }}>{name}</div>;
}

export default App;

class 대신 className

  • JSX에서 CSS 클래스를 사용할 때는 class 대신 className으로 설정해야함
function App() {
  const name = 'React';
  return <div className="react">{name}</div>;
}

export default App;

꼭 닫아야 하는 태크

  • JSX에서는 태그를 닫지 않으면 오류가 발생함
function App() {
  const name = 'React';
  return (
    <>
      <div className="react">{name}</div>
      <input></input>
    </>
  );
}

export default App;
  • 태그 사이에 별도의 내용이 들어가 있지 않은 경우, self-closing 태그를 사용함
function App() {
  const name = 'React';
  return (
    <>
      <div className="react">{name}</div>
      <input />
    </>
  );
}

export default App;

주석

  • JSX 내부에서 주석을 작성할 때는 {/* ... */}와 같은 형식으로 작성함
function App() {
  const name = 'React';
  return (
    <>
      {/* 주석 입니다 */}
      <div className="react">{name}</div>
      <input />
    </>
  );
}

export default App;
  • 시작 태그를 여러 줄 작성할 때는 그 내부에서 // ...와 같은 형태로 주석을 작성할 수 있음
function App() {
  const name = 'React';
  return (
    <>
      <div
        className="react" // 여기에도 주석 작성 가능함
        >{name}</div>
      <input />
    </>
  );
}

export default App;
  • 위 두 가지 형식으로 주석을 작성하지 않는 경우, 그 주석이 페이지에 나타나므로 주의해야 함



Rendering

초기 렌더링

  • React에서는 render함수를 사용하여 초기 렌더링함
  • render 함수는 컴포넌트가 어떻게 생겼고 어떻게 작동하는지에 대한 정보를 지닌 객체를 반환함
  • 컴포넌트 내부에 다른 컴포넌트들이 들어갈 수 있음
    • 이 경우 render 함수를 실행하면 그 내부에 있는 컴포넌트들도 재귀적으로 렌더링됨
  • 초기 렌더링 과정
    1. 최상위 컴포넌트의 렌더링 작업 종료
    2. 지니고 있는 정보를 사용하여 HTML 마크업을 만듬
    3. 실제 페이지의 DOM 요소에 주입함

조화 과정 (reconcilation)

  • React의 컴포넌트에서 데이터에 변화가 있을 때, 새로운 요소로 갈아끼우는 조화 과정을 거침
  • 조화 과정
    • 데이터를 업데이트했을 때, 컴포넌트에서 새로운 데이터를 가지고 render 함수를 다시 호출함
    • 이젠에 render 함수가 만든 컴포넌트 정보와 현재 render 함수가 만든 컴포넌트 정보를 비교함 (Virtual DOM)
    • 둘의 차이를 알아내서 최소한의 연산으로 DOM 트리를 업데이트함

Virtual DOM

  • DOM을 조작할 때 마다 엔진이 웹 페이지를 새로 그리기 때문에 업데이트가 빈번히 발생하면 성능이 저하될 수 있음
  • React는 Virtual DOM 방식을 사용하여 DOM 업데이트를 추상화함으로써 DOM 처리 회수를 최소화하고 효율적으로 진행함
  • Virtual DOM : 실제 DOM을 추상화한 JavaScript 객체
  • React에서 데이터가 변하여 웹 브라우저에 실제 DOM을 업데이트하는 과정
    1. 데이터를 업데이트하면 전체 UI를 Virtual DOM에 리랜더링함
    2. 이전 Virtual DOM에 있던 내용과 현재 내용을 비교함
    3. 바뀐 내용만 실제 DOM에 적용함

0개의 댓글

관련 채용 정보