🔗 React-TypeScript CheatSheets
sudo npm install -g create-react-appcreate-react-app my-app --template typescriptimport React from "react";
import TodoList from "./components/TodoList";
function App() {
const todos = [{ id: "t1", text: "Finish the course" }];
return (
<div className="App">
<TodoList items={todos} />
</div>
);
}
export default App;
import React from "react";
interface TodoListProps {
items: { id: string; text: string }[];
}
// const TodoList: React.FC<TodoListProps> = (props) => {
// return (
// <ul>
// {props.items.map((todo) => (
// <li key={todo.id}>{todo.text}</li>
// ))}
// </ul>
// );
// };
// export default TodoList;
export default function TodoList({ items }: TodoListProps) {
return (
<ul>
{items.map((todo) => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
);
}
import { FormEvent, useRef } from "react";
export default function NewTodo() {
const textInputRef = useRef<HTMLInputElement>(null);
function todoSubmitHandler(event: FormEvent) {
event.preventDefault();
const enteredText = textInputRef.current!.value;
console.log(enteredText);
}
return (
<form onSubmit={todoSubmitHandler}>
<div>
<label htmlFor="todo-text">Todo Text</label>
<input type="text" id="todo-text" ref={textInputRef} />
</div>
<button type="submit">+ ADD TODO</button>
</form>
);
}

import React from "react";
import TodoList from "./components/TodoList";
import NewTodo from "./components/NewTodo";
function App() {
const todos = [{ id: "t1", text: "Finish the course" }];
const todoAddHandler = (text: string) => {
console.log(text);
};
return (
<div className="App">
<NewTodo onAddTodo={todoAddHandler} />
<TodoList items={todos} />
</div>
);
}
export default App;
import { FormEvent, useRef } from "react";
type NewTodoProps = {
onAddTodo: (text: string) => void;
};
export default function NewTodo({ onAddTodo }: NewTodoProps) {
const textInputRef = useRef<HTMLInputElement>(null);
function todoSubmitHandler(event: FormEvent) {
event.preventDefault();
const enteredText = textInputRef.current!.value;
onAddTodo(enteredText);
}
return (
<form onSubmit={todoSubmitHandler}>
<div>
<label htmlFor="todo-text">Todo Text</label>
<input type="text" id="todo-text" ref={textInputRef} />
</div>
<button type="submit">+ ADD TODO</button>
</form>
);
}
import { useState } from "react";
import TodoList from "./components/TodoList";
import NewTodo from "./components/NewTodo";
import { Todo } from "./todo.model";
function App() {
const [todos, setTodos] = useState<Todo[]>([]);
// const todos = [{ id: "t1", text: "Finish the course" }];
const todoAddHandler = (text: string) => {
setTodos((prevTodos) => [
...prevTodos,
{ id: Math.random().toString(), text: text },
]);
};
return (
<div className="App">
<NewTodo onAddTodo={todoAddHandler} />
<TodoList items={todos} />
</div>
);
}
export default App;
export interface Todo {
id: string;
text: string;
}
import { useState } from "react";
import TodoList from "./components/TodoList";
import NewTodo from "./components/NewTodo";
import { Todo } from "./todo.model";
function App() {
const [todos, setTodos] = useState<Todo[]>([]);
// const todos = [{ id: "t1", text: "Finish the course" }];
const todoAddHandler = (text: string) => {
setTodos((prevTodos) => [
...prevTodos,
{ id: Math.random().toString(), text: text },
]);
};
const todoDeleteHandler = (todoId: string) => {
setTodos((prevTodos) => {
return prevTodos.filter((todo) => todo.id !== todoId);
});
};
return (
<div className="App">
<NewTodo onAddTodo={todoAddHandler} />
<TodoList items={todos} onDeleteTodo={todoDeleteHandler} />
</div>
);
}
export default App;
interface TodoListProps {
items: { id: string; text: string }[];
onDeleteTodo: (todoId: string) => void;
}
export default function TodoList({ items, onDeleteTodo }: TodoListProps) {
return (
<ul>
{items.map((todo) => (
<li key={todo.id}>
<span>{todo.text}</span>
<button onClick={onDeleteTodo.bind(null, todo.id)}>DELETE</button>
</li>
))}
</ul>
);
}
onDeleteTodo.bind(null,todo.id) 대신 ()=>onDeleteTodo(todo.id)로 대체 가능.import './TodoList.css', import './NewTodo.css' 추가