...은 배열의 새로운 복사본을 만들고 무장해제하라는 뜻.let a = [1, 2, 3];
let b = a;
console.log(a === b);
// true 나옴.
// 이 둘은 주소값이 같음
let c = [...a];
console.log(a === c);
// false 나옴
// 이 둘은 주소값이 다름
주소값을 복사하는 것이 아니라 각각 다른 메모리에 저장함.
<div>
<input type='text'
placeholder='할 일 입력'
style={{
marginRight : '10px',
writingMode : 'horizontal-tb'
}}
/>
<button>추가</button>
</div>
이런 식으로 입력 창이 만들어짐.
버튼을 꾸미기 위해 React Bootstrap을 이용할 것임
https://react-bootstrap.netlify.app/
Visual Studio Code 터미널에 아래 명령을 입력한다
npm install react-bootstrap bootstrap

import { Button } from 'react-bootstrap';
설치가 완료되면 Button을 import 해줌.
<Button variant='warning'>추가</Button>
이렇게 버튼을 추가해주면 다음과 같이 예쁜 버튼이 나옴.
텍스트 창도 보기 좋게 바꿀 수 있음.

const addTodo = () => {
if (newTodo.trim() !== '') {
setTodos([...todos, { id : Date.now(), text : newTodo, isChecked:false}]);
setNewTodo('');
}
}
//...
<div>
<input type='text'
placeholder='할 일 입력'
style={{
marginRight : '10px',
writingMode : 'horizontal-tb'
}}
value = {newTodo}
onChange={(e)=> setNewTodo(e.target.value)}
/>
<Button variant='warning' onClick={addTodo}>추가</Button>
</div>
새 할 일을 입력한 후 버튼을 누르면 추가되는 기능

setInterval(콜백함수, 시간주기(밀리세컨드));
위와 같이 설정함
import { useState } from "react";
const Timer : React.FC = () => {
const [seconds, setSeconds] = useState<number>(0);
return (
<div>
<h2>타이머 : {seconds}초</h2>
<button onClick={
function()
{
setInterval(()=>{
setSeconds((prev) => prev + 1);
}, 1000)
}
}>시작</button>
</div>
)
}
export default Timer;

App.tsx에 위의 코드를 import 해주면
1초씩 초가 늘어나는 타이머 추가 완료!
const Clock : React.FC = () => {
const [time, setTime] = useState(new Date());
setInterval(() => {
setTime(new Date());
}, 1000);
return (
<div>
현재 시간 : {time.toLocaleTimeString()}
</div>
)
}

현재 시간이 표시된다.
const [todos, setTodos] = useState<Todo[]>([
{id : 1, text : '공부하기', isChecked : false},
{id : 2, text : '잠자기', isChecked : false},
{id : 3, text : '미팅하기', isChecked : false}
]);
const removeTodo = (id : number) => {
setTodos(todos.filter((todo)=> todo.id !== id))
}
//...생략
<button
onClick={()=> removeTodo(todo.id)}
className='delbutton'
>삭제</button>

함수를 추가하여 삭제 버튼을 누르면 해당 할 일을 삭제하는 기능 추가
import React from 'react';
import { Component } from "react";
interface MyProps {
weather : string;
children : React.ReactNode;
}
// const MyWeather : React.FC<MyProps> = ({children, weather}) => {
// return (
// <div>
// {children}<p />
// 오늘의 날씨는 {weather} 입니다.
// </div>
// )
// }
class MyWeather extends Component<MyProps> {
render() {
const {children, weather} = this.props;
return (
<div>
{children}<p />
오늘의 날씨는 {weather} 입니다.
</div>
)
}
}
export default MyWeather;
함수형 컴포넌트와 클래스형 컴포넌트에서의 props 사용
function App() {
return (
<div className="container">
<MyWeather weather='맑음'>일기예보</MyWeather>
</div>
);
}
메인 함수에 위와 같이 사용해주면 동적으로 처리 가능
//props 구조 분해 할당
const {children, weather} = props;

const[showDetail, setShowDetail] = useState<boolean>(false);
const [selectedTodo, setSelectedTodo] = useState<Todo | null>(null);
const handleTodoClick = (todo : Todo) => {
setShowDetail(true);
setSelectedTodo(todo);
}
const handleCloseDetail = () => {
setShowDetail(false);
}
상세정보를 노출시키기 위한 함수 구현
const TodoModal : React.FC<TodoModalProps> = ({show, todo, handleClose}) => {
return (
<div>
<Modal show={show} onHide={handleClose} centered>
<Modal.Header closeButton>
<Modal.Title>Todo 상세 정보</Modal.Title>
</Modal.Header>
<Modal.Body>{todo?.text}</Modal.Body>
</Modal>
</div>
)
}
리액트 부트스트랩의 modal 구현 코드를 참고하여 변경하여 사용한다.