Backend
home

2024. 6. 25 - React

리액트란?

리액트(React)
A Javascript library for building user interfaces. (사용자 인터페이스를 만들기 위한 자바스크립트 라이브러리)
라이브러리는 개발자에게 권한이 있음, 프레임워크는 제어 권한이 프레임워크 자신에게 있음
SPA (Single Page Application)
하나의 페이지에만 존재하는 웹사이트
state - 리액트 컴포넌트 상태
웹 사이트 규모가 커지면 컴포넌트 개수가 많아지면서 상태 관리의 복잡도가 증가
규모 큰 프로젝트에선 상태 관리를 위해 Redux, Mobx, Recoil 등의 외부 상태 관리 라이브러리 사용

리액트 설치

리액트 설치
해당 페이지에서 20.15.0 버전 다운로드 (https://nodejs.org/en/download/prebuilt-installer)
설치 후 버전 확인
node -v npm -v
Plain Text
복사
react 프로젝트 생성
sudo npx create-react-app [프로젝트명] 입력하면 프로젝트가 생성됨. (sudo를 적지 않았을때 오류가 발생...)
Plain Text
복사
프로젝트 폴더를 vscode에서 다시 열어준 후 터미널에 npm start를 치면 크롬으로 미리보기가 뜬다.
Plain Text
복사
react 폴더 권한 해제 ⇒ 해제 안해주면 저장이 안 됨!
sudo chmod -R 777 /Users/haminsung/desktop/frontproject/react
Plain Text
복사

JSX

JSX
자바스크립트의 확장 문법
Javascript와 XML/HTML 을 합친 것 → Javascript anc XML의 앞 글자를 따서 JSX라고 부름
자바스크립트와 HTML 코드가 결합된 상태
const element = <h1>Hello, React.js</h1>
JavaScript
복사
JSX 역할
JSX는 내부적으로 XML/HTML 코드를 자바스크립트로 변환하는 과정을 거친다.
// 두 코드 모두 동일한 코드 const element1 = ( <h1 className='title'> Hello, React.js </h1> ) const element2 = React.createElement( 'h1' {className : 'title'}, 'Hello, React.js' ) const element3 = { type: 'h1', props: { className: 'title', children: 'Hello, React.js' } }
JavaScript
복사
Type: 엘리먼트의 유형
<div>나 <span> 같은 HTML 태그가 올 수도 있고, 다른 리액트 컴포넌트가 들어갈 수도 있음
props : 엘리먼트의 속성
children : 현재 엘리먼트가 포함하고 있는 자식 엘리먼트
const element2 = React.createElement( type, props, children )
JavaScript
복사
실습
// Team.Js import React from "react"; import Player from "./Player"; function Team (props) { return ( <div> <Player playerName='손흥민1' playerNumber='71'></Player> <Player playerName='손흥민2' playerNumber='72'></Player> <Player playerName='손흥민3' playerNumber='73'></Player> </div> ) } export default Team;
JavaScript
복사
// Player.js import React from "react"; function Player(props) { return ( <div> <div>축구선수 정보 출력</div> <ul> <li>선수 이름 : {props.playerName}</li> <li>선수 번호 : {props.playerNumber}</li> </ul> </div> ) } export default Player;
JavaScript
복사
// ConfirmDialog.js import React from "react"; function Button(props) { return ( <button className={`bg-${props.color}`}> {props.children} </button> ) } function ConfirmDialog(props) { return ( <div> <p>내용을 확인하셨다면 버튼을 클릭하세요</p> <Button color='green'> 확인 버튼 </Button> </div> ) } export default ConfirmDialog;
JavaScript
복사

컴포넌트

컴포넌트
모든 페이지가 컴포넌트로 구성되어 있음
하나의 컴포넌트는 또 다른 여러 개의 컴포넌트 조합으로 구성될 수 있음
리액트 컴포넌트는 props 값을 입력 받아서 리액트 엘리먼트 객체를 반환
props의 중요한 특징은 읽기전용(ReadOnly)
값을 변경할 수 없음
props의 값은 리액트 컴포넌트가 엘리먼트를 생성하기 위해 사용하는 값
다른 props 값으로 엘리먼트를 생성하려면 새로운 값을 컴포넌트에 전달하여 새로 엘리먼트를 생성해야 함
이 과정에서 엘리먼트가 다시 렌더링됨
pure 하다
같은 입력값에 대해서는 항상 같은 출력값을 리턴함
Impure 하다
입력으로 받은 파라미터 값을 변경함
사용법
JSX 사용하는 경우 키와 값으로 이루어진 키-값 쌍의 형태로 컴포넌트에 props를 넣을 수 있음
function Team(props) { return ( <Player playerName='SON' playerNumber={7}</Player> ) }
JavaScript
복사
컴포넌트 종류
클래스 컴포넌트와 함수 컴포넌트
초기버전에서는 클래스 컴포넌트 주로 사용
최근에는 함수 컴포넌트 개선해서 주로 사용하게 됨
함수 컴포넌트 개선하는 과정에서 훅(hook)이 개발되어 현재 리액트 개발에서는 거의 훅을 사용
클래스 컴포넌트
ES6의 클래스라는 것을 사용해서 만들어진 형태의 컴포넌트
함수 컴포넌트
모든 리액트 컴포넌트는 Pure 함수 같은 역할을 해야 함
리액트의 컴포넌트는 일종의 함수
function Welcome(props) { return <h1>안녕~!! {props.name} </h1> }
JavaScript
복사
컴포넌트 이름
컴포넌트 이름은 항상 대문자로 시작하기 (소문자 입력시 DOM 태그로 인식하기 때문)
<div>, <span> ⇒ 컴포넌트
컴포넌트 합성
여러 개 컴포넌트 합쳐서 하나의 컴포넌트를 만드는 것
복잡한 화면을 여러 개의 컴포넌트로 나누어서 구현할 수 있음
컴포넌트 추출
복잡한 컴포넌트를 쪼개서 여러 개의 컴포넌트로 나누는 것
큰 컴포넌트에서 일부를 추출해서 새로운 컴포넌트를 만드는 것
컴포넌트가 작아질수록 해당 컴포넌트의 기능과 목적이 명확해지고, props도 단순해지기에 컴포넌트의 재사용성이 올라가고 동시에 개발 속도도 향상됨