프로그래머스 풀스택 46
posted on 31 Oct 2024 under category programmers in series programmers
프론트엔드 기초: React + TypeScript(9)
💫 클래스형 컴포넌트와 함수형 컴포넌트
컴포넌트를 별도로 만들어서 호출하는 형태!
클래스형 컴포넌트
import { Component } from "react";
//컴포넌트라는 클래스를 반드시 상속!!!
class ClassCom extends Component {
render() {
return (
<div>
클래스형 컴포넌트
</div>
)
}
}
export default ClassCom;
cd 리액트 폴더이름
, npm start
으로 실행하면 됨함수형 컴포넌트
import React from "react";
function FuncCom()
{
return(
<div>
함수형 컴포넌트
</div>
)
}
export default FuncCom;
import React from "react";
const FuncCom = () =>
{
return(
<div>
함수형 컴포넌트
</div>
)
}
export default FuncCom;
💫 state 사용하기
import React, { useState } from "react";
const Todolist : React.FC = () => {
const title : string = "오늘 할 일";
const [todos] = useState(['공부하기', '잠자기', '미팅하기']);
return(
<div>
<h1>{title}</h1>
<p></p>
<div className="container">
<ul>
<li>{todos[0]}</li>
<li>{todos[1]}</li>
<li>{todos[2]}</li>
</ul>
</div>
</div>
)
}
export default Todolist;
FC : Functional Component. 코드를 좀 더 명확하게 해줌
state : 일반 함수와 달리, react 내부에서 데이터를 동적으로 상태를 관리하겠다는 것임.
useState : 동적인 상태를 관리하기 위해 사용하는 훅(hooks).
자동으로 데이터를 관리해줌!
💫 구조 분해 할당 이해
useState
에는 한 쌍으로, 첫 번째는 state의 현재 데이터, 두 번째는 상태 변경 함수가 들어감
✨ex) const [state, setState] = useState(initialValue);
✨ex) const [todos, setTodos] = useState<string[]>(['공부하기', '잠자기', '미팅하기']);
특정 개체를 거꾸로 분열을 해서 대입한다는 것.
배열, 객체 등등 가능
const colors = ['red', 'green', 'blue'];
const [f, s, t] = colors;
console.log(f); // 출력: red
console.log(s); // 출력: green
console.log(t); // 출력: blue
const person = {
name: 'lee',
age: 20,
city: 'seoul'
};
const { name, age, city } = person;
console.log(name); // 출력: lee
console.log(age); // 출력: 20
console.log(city); // 출력: seoul
클래스(도시) = 멤버변수(백성들) + 멤버함수(성의 문)
클래스는 기본적으로 캡슐화!!
캡슐화의 핵심은 정보 은닉(Information Hiding)!
💫 데이터 반복 처리하기
구조체, 공용체, 클래스 👉 사용자가 정의한 것
내부의 여러 개의 타입들이 그룹되어 있음
의미적으로 연관된 데이터들의 집합
interface말고 type을 사용하는 이유 : 기존의 재료로 새로운 타입을 만들 때 사용
interface를 사용할 때 : 객체의 구조를 정의할 때 사용
type Todo = {
id : number;
text : string;
isChecked : boolean;
};
import React, { } from "react";
const MapTest = () => {
const fruits = ['apple', 'banana', 'orange'];
return(
<div>
<h2>과일</h2>
<ul>
{
fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))
}
</ul>
</div>
)
}
export default MapTest;
<li key={index}>
: 렌더링 구분을 위한 키 속성을 반드시 적어줄 것!💫 체크박스 기능 추가
const handleCheckedChange = (itemId : number) => {
setTodos((prevItems) =>
prevItems.map((item) =>
item.id === itemId ? {...item, isChecked : !item.isChecked } : item
)
)
}
💫 새로운 게시물 추가하기
npm install react-bootstrap bootstrap
import { Button } from 'react-bootstrap';
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
crossorigin="anonymous"
/>
index.html
에 들어가서 <title>태그 위에 적어줌<button>추가</button>
에서 <Button>추가</Button>
으로 사용할 수 있게 됨...todos
: 스프레드(spread) 연산자. 기존의 배열을 변경X, 새로운 배열을 생성해서 값을 추가함
배열의 새로운 복사본을 만들고 무장해제. 독립적인 메모리 공간 생성
import { Button, Form } from 'react-bootstrap';
//...생략
<Form.Control size="lg" type="text" placeholder="Large text" />
💫 시계 추가하기
setInterval(콜백함수, 시간 주기)
const Clock : React.FC = () => {
const [time, setTime] = useState(new Date());
setInterval(() => {
setTime(new Date());
}, 1000)
return (
<div>
현재 시간 : {time.toLocaleDateString()} {time.toLocaleTimeString()}
</div>
)
}
💫 게시물 삭제하기
setTodos(todos.filter((todo) => todo.id !== id))
filter() : 전체 배열에서 특정 조건을 만족하는 요소만 필터링해서 새로운 배열을 만들어 리턴해줌
Y 일을 통해 명확히 알게 되었거나 이해한 부분(한 일)에 대해 정리 :
클래스형/함수형 컴포넌트, 구조 분해 할당, 기능 추가
W 배운 점과 시사점 :
함수형 컴포넌트
배열 구조 분해 할당 : 배열의 요소를 순서대로 분해하여 개별 변수에 할당
객체 구조 분해 할당 : 객체의 속성 이름을 기준으로 값을 매칭하여 변수에 할당
T 응용하여 배운 것을 어디에 어떻게 적용할지:
프론트엔드 작업할 때 사용!