te___ho
NO RULES
te___ho
전체 방문자
오늘
어제
  • 분류 전체보기 (89)
    • My project (28)
      • High Traffic Lab (4)
      • Nanaland in Jeju (8)
      • Univey (3)
      • inflearn_clone? (13)
    • Spring (19)
    • Network & CS (9)
    • Java (1)
    • Front_End (8)
    • Algorithm (11)
    • ETC (6)
    • Scribble (7)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
te___ho

NO RULES

Front_End

React 정리 (useState, className, propTypes, CSSModule, useEffect, Route, map)

2023. 3. 8. 13:21

프로젝트 진행하면서 프론트 엔드를 안 할 수는 없어서 간단한 무료 강의 보고 중요했던 부분 간단 정리 시작~ (정보 공유보다는 복습 용도로 작성하는 글이다.)

 

 useState()

 컴포넌트에서 동적인 state를 관리할 수 있다. import {useState} from "react";로 불러와서 사용한다.

 값을 변경한 후 rerender까지 처리해준다. useState는 해당 값과, modifier를 반환해 준다.

 ex) const [counter, setCounter] = usetState(0);  [counter, setCounter] 각각 순서대로 변수, modifer이다. useState(0)의 0은 counter의 초깃값으로 세팅된다. modifer까지 사용하는 예제를 작성해 보겠다.

 ex) count onClick = () =>{ setCounter((current) => current+1)};  값을 수정할 때 직접 counter + 1 하는 것보다 modifier에 매개 변수를 작성 (위의 current)하여 값을 변경하는 것이 더 좋은 소스이다. 

 state가 리스트인 경우 원래 내용을 포함하여 추가하려면  ex) setToDos(preToDos => [toDo, ...prevToDos])와 같이 작성해 준다. (... 을 사용하는 것)

 

  className

 html 태그에서 안에 클래스를 부여할 때 class를 사용하였지만 jsx에서는 className을 사용한다.

 

 input control

 input에 입력을 받을 때 value = {data}로 사용하고 data를 useState로 생성한다. 입력이 발생하면 onChange={handleData}로 감지하여 const handleData = (event) => setData(event.target.Data)로 값 변경해 준다.

 

props, prop-types

 component끼리 데이터를 주고받는 방법이다. App.js에서 <Login id={userId} pw={userPw} /> 을 작성했다 예를 들겠다. Login component에 id와 pw가 넘어갔다. function Login (props){ ...} 같이 작성 후 props.id, props.pw로 사용할 수 있다. 더 간단히 function Login ({id, pw}){...} 작성 후 바로 id, pw로 사용할 수 있다. 

 proptypes은 props들의 타입을 명시해서 오류를 막을 수 있다. 위의 예시를 이어서 Login.js에 import PropTypes from "prop-types"; 작성 후 Login.propTyes ={ id : PropTypes.string.isRequired,  pw : PropTypes.string.isRequired,}; 를 작성해 주면 잘못된 타입을 넘겨받았을 때 오류를 감지할 수 있다. (배열은 PropTypes.arrayOf(PropTypes.string).isRequired) 해주면 된다.)

 

 CSS Moudle

 react는 component라는 기술을 사용하기에 한 페이지 안에서 여러 component들이 존재하여 css가 (id, className 중복으로 인하여) 겹치는 경우가 발생할 수 있다. 이를 해결하기 위해 css Module을 사용한다. Login.js에 적용할 css Module파일을 만들어 보겠다. Login.module.css로 파일을 만든다. (Login이라고 적어야만 하는 것 아님.) 그 다음 Login.js에 import styles from "./Box.module.css"; 을 작성해준다. 준비가 끝난 것이다. 이제 id와 className을 부여할 때 import와 from 사이에있는 객체를 사용한다. (styles라고 적어야만하는 것 아님) 

 ex) <div className={styles.Box}> test </div>        >>>>>>>>>>>Login.module.css 파일에 css와 같이. Box로 속성들을 정하면 된다.

 

 useEffect

 useState에서 사용한 값이 변경될 경우 모든 코드들이 다시 실행된다. 그대로 유지해도 되는 코드들도 화면을 다시 그린다는 뜻이다. 이럴 경우 대표적 단점들 중 하나로 만약 엄청난 양의 데이터를 갖고 있는 api가 다시 호출되면 시간과 자원이 낭비되는 케이스가 있다. 이를 해결하기 위해 useEffect를 사용한다. 기본 형태는 useEffect(함수, [])이다. 함수는 목적 함수이다. 두 번째 인자는 어떤 것의 값이 바뀐 경우 함수를 실행할지 정한다. 다시 말해 [] 안에 있는 인자가 바뀔 때마다  함수를 재실행시킨다. []가 비어있으면 코드가 처음 실행될 때만 함수가 실행된다. 앞서 말한 문제를 해결하려면 함수 부분에 api를 불러오는 부분을 작성하고 []를 비어두면 api는 코드가 처음 실행될 때만 호출된다. (함수에 return값은 컴포넌트가 destory 될 때 실행되는데 이 부분은 잘 사용하지 않는 것 같다. 알아만 두자.)

 

 Map

 js 문법 중 하나이다. 리스트에 멤버 모두에게 적용되는 함수를 작성할 수 있다. list = ['a', 'b', 'c', 'd']라고 가정하겠다. 

 {list.map((l)=>{ <li>l.toUpperCase()<li/>})}    설명하면 매개변수인 l은 list의 원소들을 차례로 처리해 준다. 이 코드가 동작하면 A, B, C, D 가 <li> 형태로 나타나게 된다. 리스트에 map을 이용할 때 key값도 설정해 주는 것 잊지 말자. 까먹으면 경고창 나오니 참고하자.

 

Route

import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/movie/:id" element={<Detail />} />
      </Routes>
    </Router>
  );
}

 App.js에 작성하면 좋은 문법이다. path에 적혀있는 url로 접속을 하면 element에 해당되는 컴포넌트를 보여준다. Spring 컨트롤러에서 view 페이지를 매핑해 주는 것과 같은 역할인 것 같다. 두 번째 Route에 :id 부분은 정해진 것이 아니라 매개변수를 받는 것이다. 이때 Detail.js에 const { id } = useParams(); 를 작성해서 id를 변수로 사용할 수 있다. /movie/1로 url을 입력하면 Detail.js에서 id =1이 되는 것이다.

 

(이후 공부하다 알게 되는 것이 있으면 추가 정리할 것이다.) 

 

 

 

 

728x90
반응형
저작자표시 (새창열림)

'Front_End' 카테고리의 다른 글

[Front End] mini project  (1) 2021.12.13
[Front End] Do it! HTML+CSS+JAVASCRIPT 웹 표준의 정석 마무리(웹 사이트 만들기)  (0) 2021.11.21
[javascript] + [Front End] 간단 정리 및 마무리  (0) 2021.11.18
[HTML] <form>, <input>, <select> 사용자에게 입력 받기 (2)  (1) 2021.11.09
[HTML] <form>, <input>, <select> 사용자에게 입력 받기 (1)  (0) 2021.11.07

    티스토리툴바