본문 바로가기

프로그래밍/Web

리액트 주요 요소

JSX

HTML 과 비슷한 형식으로 스크립트 작성 가능
기존 HTML 형식과 비슷하지만 속성값등은 카멜 케이스 형식으로 사용해야 함
변수, 객체 등 참조하는 경우 { } 사용

 

 

CSS

import MyCSS from './My.css';


function App() {
	return (
        <div className={MyCSS.style}>
            .
            .
        </div>
    );
}

export default App;

 

 

컴포넌트

JSX내의 태그를 커스텀하게 생성
function, class 가능

const HelloWorld = function() {
	return <div><p>HelloWorld</p></div>
}

export default HelloWorld;

jsx 에서 <HelloWorld /> 와 같이 사용

 

component props

컴포넌트에 전달할 읽기전용 속성

const default function HelloWorld(props) {
    console.log(props)
    
    return (
        <div><p> { props.value } </p></div>
    );
}

props 는 오브젝트타입이며, 해당 컴포넌트에 전달될 속성들의 이름, 값으로 이루어져 있음.
jsx에서 <HelloWorld 속성명="값" /> 형태로 컴포넌트에 인자 전달.
props.속성명으로 각 속성에 접근가능하며, 단일 속성인 경우 js 구조분해할당과 같이 {인자} 로 설정해 바로 사용

export default function HelloWorld( {value} ) {

}

 

 

 

 

이벤트

버튼 이벤트

onClick = { () => {} }

속성에 함수를 직접 작성하거나 연결할 함수명 지정

<button onClick={
    () => {
        console.log("Clicked!!");
    }}
>

 

export default function MyComponent() {
    function buttonHandler() {
        console.log("Clicked!!!");
    }
    
    return (
        <div>
            <button onClick={buttonHandler}>Click</button>
        </div>
    );
}

함수명을 전달하는 경우에는 인자를 전달할 수 없으므로, 함수 직접 작성후 해당 함수내에서 원하는 함수를 호출.

 

텍스트 입력

onChange= { e => { }}

인자 1개를 받는 함수로 구성

<input type="text" onChange={showText} />


function showText(e) {
    console.log(e.target.value);
}

 

여러개의 input 을 하나의 핸들러 함수 사용하는 경우 e.target.name 으로 구분 가능

<input name="input1" onChange={ handler } />
<input name="input2" onChange={ handler } />

function handler(e) {
    console.log(e.target.name);
}

 

 

state

DOM 업데이트를 별도로 하지 않고 상태가 변경시 자동으로 다시 렌더링

기능추가
import { useState } from 'react';

정의
const [name, setter] = useState("default_value");

사용
<p> { name } </p>

 

 

데이터 반복 처리

// json 데이터
const str = '{
    "values": [
        { "id": "chance", "level" : 1},
        { "id": "user", "level": 10 }
    ]
}';

const json = JSON.parse(str);


// map
<ul>
    { json.values.map( item => (
        <li key={ item.id} > id : { item.id } </li>
    ))}
</ul>

 

 

페이지 이동

라우터를 이용해 path 별로 컴포넌트를 등록해 사용할 수 있다.

> npm install react-router-dom

 

각 path에 컴포넌트를 지정

Routes는 포함된 Route 중에서 일치하는 컴포넌트로 라우팅해준다.
루트 라우트는 path="/" 대신 index로 대체 가능

<BrowserRouter>
    <Routes>
        <Route path="/" element={<component/>}/>
        <Route path="/path" element={<component/>/>
        <Route path="*" element={<component/>/>
    </Routes>
</BrowserRouter>

 

 

중첩 라우팅

<Routes>
    <Route path="/root" element={<RootComponent/>}>
        <Route path="sub1" element={<SubComponent/>}/>
        <Route path="sub2" element={<SubComponent/>}/>
    </Route>
</Routes>

 

/root/sub1 과 같이 접근을 하게 되면,
RootComponent 가 표시되고, RootComponent 내부에서 Outlet으로 지정된 곳에 SubComponent 가 라우팅 된다.

<div>
    <h1>Main</h1>
    <Outlet />
</div>

 

useParams

path가 /sub 와 같이 고정된 형태가가 아닌 /sub/1, /sub/2 와 같이 동적 파라미터를 포함하고 있는 경우, 전달된 path의 파라미터 값을 얻기위해 useParams() 메쏘드 사용.

Route에는 파라미터값 전달을 위해 path를  /:parameter 형식으로 작성한다.

import { BrowserRouter, Route, Switch } from "react-router-dom";


function App() {
    return (
        <BrowserRouter>
           <Routes>
               <Route path="/" element={<RootComp />} />            
               <Route path="/sub/:id" element={<SubComp />} />
               <Route element={<DefaultComp />} />
           </Routes>
        </BrowserRouter>
    );
}

 

렌더링할 컴포넌트에서 파라미터 값을 얻어와 필요한 처리를 진행

import { useParams } from "react-router-dom";

export default function SubComp() {
    const {id} = useParams()
    
    return (
       <h1>sub page : {id}</h1>
    )
}

 


Link 컴포넌트를 통한 페이지 이동

<a href="/path"></a> 처럼 <Link to="/path"></Link>로 사용한다.

// 페이지 링크
import { Link } from "react-router-dom";

export default HelloWorld() {
   return (
       <li key={ item.id} >
           <Link to="/sub">Sub화면으로</Link>
       </li>
   );
}

 

useNavigate() 를 통한 페이지 이동

import { useNavigate } from 'react-router-dom';

export default HelloWorld() {
    const navigate = useNavigate();
    
    return (
        <button onClick={() => {
            navigate('/sub');
        }}>Sub화면으로</button>
    );
}

 

 

useEffect

렌더링이나 상태값이 변경되는 경우 호출
2번째 인자에 체크하고자 하는 상태를 넣어주면 해당 상태 변경시에만 호출됨

useEffect( () => {
    console.log("change");
}, []);

빈배열([]) : 컴포넌트가 화면에 가장 처음 렌더링 될 때 한번 실행
배열 생략 : 렌더링 될때마다 실행
[state] : state가 마운트, 변경 때 실행

 

 

TypeScript 적용

타입스크립트와 리액트 라이브러리들의 타입 라이브러리 설치
(create-react-app 으로 생성한 프로젝트의 경우 @types/jest 필요)

> npm install typescript @types/node @types/react @types/react-dom @types/react-router-dom  @types/jest

파일 확장자를 tsx 로 변경

 

props 타입 설정

컴포넌트의 속성 전달을 위한 props 도 타입이 정의되어야 한다.

interface IProps {
    data: IData;
}

interface IData {
    id: string;
    value: number;
}

export default function HelloWorld( { data: d }: IProps) {

}

 

params

useParams를 사용하기 위해 path의 파라미터도 타입을 지정해 주어야 한다.
제네릭으로 useParams 타입을 지정

import { useParams } from "react-router-dom";

export default function SubComp() {
    const {id} = useParams<{ id: string }>()
    
}

 

 

 

팝업

npm install react-modal

 

import React, { useState } from 'react';
import Modal from 'react-modal';

function App() {
    const [isOpen, setIsOpen] = useState(false);
    return (
        <>
            <button onclick={() => setIsOpen(true)}>Open</button>
            <Modal isOpen={isOpen} onReuquestClose={() => setIsOpen(false)}>
                대화상자
                <button onClick={() => setIsOpen(false)}>Close</button>
            </Modal>
        </>
    );
}

'프로그래밍 > Web' 카테고리의 다른 글

[tauri] 테스트용 앱 기본 구성  (0) 2024.05.03
[tauri] 개발환경  (0) 2024.03.19
[JavaScript] Promise, async/await  (0) 2018.08.17
WebXR + three.js  (0) 2018.08.09
javascript 모듈화 패턴  (0) 2018.07.26
VSCode 웹 디버깅  (0) 2018.07.19
openssl  (0) 2018.07.17
Windows 레드마인 설치(Bitnami)  (1) 2017.09.22
Gradle Wrapper  (0) 2017.03.06
스프링 요청/응답  (0) 2017.02.26