[React] Component / JSX

2024. 9. 8. 09:50·React

Component


: React에서 UI를 구성하는 기본 단위 (재사용가능)

🎈컴포넌트의 이름은 항상 대문자로 시작하기

1. 함수형 컴포넌트

function MyComponent() {
  return <div>Hello!</div>;
}

* 화살표 함수 컴포넌트

const MyComponent = () => <div>Hello!</div>;

- 한줄로 작성시 {return} 생략가능

- {}중갈호 같이 적는다면 return 필수

const MyComponent = () =>{
    return (
        <div>
        	<h1>Hello!</h1>
        </div>
    );
};

 

2. 클래스형 컴포넌트

: React의 이전 버전 방식

기존 프로젝트나 레거시 코드에서는 여전히 클래스형 컴포넌트를 사용하고 있을 수 있기때문에 알아두면 좋음.

class MyComponent extends React.Component {
  render() {
    return <div>Hello!</div>;
  }
}

 

 

JSX(JavaScript XML)


: JavaScript와 XML의 조합으로, React에서 HTML처럼 보이는 구문을 JavaScript 코드 안에서 사용할 수 있게 해주는 문법

 

JSX는 브라우저가 직접 이해하지 못하기 때문에, **컴파일러(예: Babel)**를 통해 순수 JavaScript 코드로 변환

이를 통해 React 컴포넌트 안에서 쉽게 UI 구조를 정의 가능

const element = <h1>Hello, World!</h1>;

*반환하는 모든 태그는 반드시 최상위 태그로 감싸져야함

 

JSX에서 JavaScript 표현식


: HTML 태그에서 자바스크립트의 표현식을 직접 사용 가능 {}

-표현식? 값으로 평가될수있는 코드,식 ( 변수, 연산, 삼항 연산자, 함수 호출 등 )

ex) 1+2 식은 3으로 평가되니 표현식

 

*${} 템플릿 리터럴

더보기

문자열안 동적 생성, 표현식 삽입 때 사용

const name = "블프";
const a = 5;
const b = 10;
const user = { name: "야옹", age: 25 };
const message = `안녕하세요, 저는 ${name}입니다. //동적
반가워용. //멀티라인 문자열 \n필요없음
${a + b} //표현식
Hello, ${user.name}`; //중첩표현식

 

1. 산술표현식

function MyComponent(){
    const num1 = 1;
    const num2 = 2;

    return (
        <div>{num1 + num2}</div>
    );
};

export default MyComponent;

2. 문자열 표현식

function MyComponent(){
    const a = "리";
    const b = "액트";

    return  <div>{a + b}</div>
};

export default MyComponent;

3. 논리 표현식

function MyComponent(){
    const a = true;

    return  <div>{String(a)}</div>
};

export default MyComponent;

-객체

function Body() {
    const obj = {
      name: "abc",
      age: 12,
    };
    return (
        <div>
            {/* <p>{obj}</p>  에러!*/}
            <p>{obj.name}</p>
            <p>{obj.age}</p>
        </div>
    );
}
export default Body;

-삼항연산자

function MyComponent(){
    const a = true;
    
    return  (
        <div>
            <h1>{a === true? "진실":"거짓"}</h1>
        </div>
    )
};

export default MyComponent;

-조건문

function MyComponent(){
    const a = 11;
    
    if(a > 10){
        return <div>{a}는 10보다 큼</div>
    } else {
        return <div>{a}는 10 이하</div>
    }
};

export default MyComponent;

 

스타일링


1. 전체 적용

-"styles.css" 생성

button{
    background-color: aqua;
}

 

-.js

상단추가

import "./styles.css";

const MyComponent = () =>{
    return (
        <div>
            <h1>Hello!</h1>
            <button>버튼1</button>
            <button>버튼2</button>
        </div>
    );
};

모든 버튼에 동일 스타일 적용

2. 인라인

style={{스타일 규칙들}}, 카멜 표기법

*첫 중괄호: js표현식, 두번째 중괄호: js 객체 (style 속성 js객체로 받음)

const MyComponent = () =>{
    return (
        <div style={{background: "skyblue"}}>
        	<h1>Hello!</h1>
        </div>
    );
};

각각 개별 적용 이런게 많이긴다면 코드 길어짐 → CSS Module 사용

3. CSS Module ✅

- "Button.module.css"생성

/* 클래스 */
.btn1 {
    background: skyblue;
}
.btn2 {
    background: lightpink;
}

-MyComponent.js

import styled from "./Button.module.css";

const MyComponent = () =>{
    return (
        <div>
            <h1>Hello!</h1>
            <button className={styled.btn1}>버튼1</button>
            <button className={styled.btn2}>버튼2</button>
        </div>
    );
};

export default MyComponent;

 

cra가 임의 클래스 이름 만들어냄

 

4. styled component ✅

자세히 : https://bbbpp.tistory.com/173

const Wrapper = styled.div`
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 200px;
  padding: 100px 0px;
  a { //Wrapper 컴포넌트 내부에 있는 모든 <a> 태그에 적용
    color: #1d9bf0;
    }
`;
const Title = styled.h1`
  font-size: 30px;
`;

function App() {
    return (
        <Wrapper>
        	<Title>HI!</Title>
        </Wrapper>
    )
}

 

*createGlobalStyle

:전역 스타일(Global Styles)을 설정할 때 사용되는 기능

전체 애플리케이션에 적용될 공통적인 스타일 규칙을 정의( 루트 컴포넌트(예: <App />) 내에서 사용 )

import { createGlobalStyle } from 'styled-components';
//import reset from 'styled-reset';

const GlobalStyles = createGlobalStyle`
  //${reset};  /* 브라우저 기본 스타일 초기화 */
  * {
    box-sizing: border-box;
  }
  body {
    background-color: black;
    color:white;
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: 'Arial', sans-serif;
  }
`;
  
function App() {
  return (
    <>
      <GlobalStyle />
      {/* 나머지 컴포넌트 */}
    </>
  );
}

export default App;

참고: https://github.com/zacanger/styled-reset/blob/master/src/index.ts

 

 

5. 컴포넌트 내 변수 선언

const App = () => {
    const style = {
        color: 'blue',
        fontSize: '20px',
    };
    
    return (
        <div style={style}>Hello World</div>
    );
}

 

*VSCode에서 styled-components와 같은 CSS-in-JS 라이브러리를 사용할 때 자동완성

TypeScript and Styled Components 플러그인을 설치

https://marketplace.visualstudio.com/items?itemName=styled-components.vscode-styled-components

 

'React' 카테고리의 다른 글

[React] 라이프 사이클과 제어(useEffect)  (0) 2024.09.11
[React] useState / Memo  (0) 2024.09.10
[React] Props / 이벤트 처리  (0) 2024.09.09
[React] 개발 툴 설치 (Create React App, Vite)  (0) 2024.09.05
[React] 개요  (0) 2024.09.04
'React' 카테고리의 다른 글
  • [React] useState / Memo
  • [React] Props / 이벤트 처리
  • [React] 개발 툴 설치 (Create React App, Vite)
  • [React] 개요
Naah
Naah
  • Naah
    blueprint
    Naah
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • Java (28)
      • Kotlin (0)
      • TypeScript (7)
      • React (22)
      • Next.js (1)
      • Spring (22)
      • JPA (12)
      • Spring Data JPA (6)
      • Querydsl (1)
      • Error (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • manage
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Naah
[React] Component / JSX
상단으로

티스토리툴바