# TodoList_React+TS
**Repository Path**: lzy1110/TodoList_React_TS
## Basic Information
- **Project Name**: TodoList_React+TS
- **Description**: 用React+TS来写todoList案例,可快速入门、复习
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: https://www.bilibili.com/video/BV1WC4y1B7Uq/?spm_id_from=333.788&vd_source=93ca85255ba515f0be10695b87a668c9
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-04-07
- **Last Updated**: 2024-04-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# React + TS 的 todoList 案例
## 初始化
### 搭建项目
```cmd
npx create-next-app@latest
npm run dev
```
### 去掉原来的默认主页
```tsx
// src\app\page.tsx
export default function Home() {
return
TodoList
;
}
```
### 拆分、新建组件
在 src 下新建 components 文件夹,在里面新建对应的 4 个 tsx: AddTodo、TodoItem、AddTodo、TodoFilter
## 初始化组件
### TodoFilter 组件、TodoItem 组件、AddTodo 组件、TodoList 组件
```tsx
function TodoFilter() {
return (
);
}
export default TodoFilter;
function TodoItem(props: any) {
return {props.todo.title}
;
}
export default TodoItem;
function AddTodo() {
return (
AddTodo
);
}
export default AddTodo;
function TodoList() {
return (
TodoList
);
}
export default TodoList;
```
### 引入组件
```tsx
// src\app\page.tsx
import AddTodo from "@/components/AddTodo";
import TodoFilter from "@/components/TodoFilter";
import TodoList from "@/components/TodoList";
export default function Home() {
return (
);
}
```
## 正式开始
### 引入基本的 todoList 空数组
编写基本的 todo 接口
```ts
// src\types.ts
export interface Todo {
id: number;
text: string;
completed: boolean;
}
```
引入接口,定义空数组
```tsx
import { Todo } from "@/types";
export default function Home() {
const [todos, setTodos] = useState([]);
...
}
```
### 定义 增、删、改 方法
```tsx
const addTodo = (text: string) => {
const newTodo = {
id: Date.now(),
text,
completed: false,
};
setTodos([...todos, newTodo]);
};
const deleteTodo = (id: number) => {
setTodos(todos.filter((todo) => todo.id !== id));
};
const toggleTodo = (id: number) => {
setTodos(
todos.map((todo) => {
if (todo.id === id) {
todo.completed = !todo.completed;
}
return todo;
})
);
};
```
### 定义 查 方法
```tsx
const [filter, setFilter] = useState("all");
const getFilteredTodos = () => {
switch (filter) {
case "completed":
return todos.filter((todo) => todo.completed);
case "active":
return todos.filter((todo) => !todo.completed);
default:
return todos;
}
};
```
### 完善 增 方法
```tsx
// src\components\AddTodo.tsx
import { useState } from "react";
interface AddTodoProps {
addTodo: (text: string) => void;
}
function AddTodo({ addTodo }: AddTodoProps) {
const [text, setText] = useState("");
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (text.trim().length === 0) return;
addTodo(text);
setText("");
};
return (
);
}
export default AddTodo;
```
### 完善 TodoList
```tsx
// src\app\page.tsx
...
...
```
```tsx
// src\components\TodoList.tsx
import { Todo } from "@/types";
import TodoItem from "./TodoItem";
interface TodoListProps {
todos: Array;
toggleTodo: (id: string) => void;
deleteTodo: (id: string) => void;
}
function TodoList({ todos, toggleTodo, deleteTodo }: TodoListProps) {
return (
{todos.map((todo) => (
))}
);
}
export default TodoList;
```
```tsx
// src\components\TodoItem.tsx
function TodoItem({ todo, toggleTodo, deleteTodo }: any) {
return (
{todo.text}
);
}
export default TodoItem;
```
### 完善 查(筛选) 方法
```tsx
// src\app\page.tsx
...
...
```
```tsx
// src\components\TodoFilter.tsx
function TodoFilter({ setFilter }: any) {
return (
);
}
export default TodoFilter;
```