使用React和Material-UI構建TODO應用的前端UI

使用React和Material-UI構建TODO應用的前端UI

        • 引言
        • 環境準備
        • 代碼解析
          • 1. 導入必要的模塊
          • 2. 創建React組件
          • 3. 定義函數
            • 3.1 獲取TODO列表
            • 3.2 創建TODO項
            • 3.3 更新TODO項
            • 3.4 刪除TODO項
            • 3.5 處理編輯點擊事件
            • 3.6 關閉編輯對話框
            • 3.7 保存編輯內容
          • 4. 使用Effect鉤子
          • 5. 渲染組件
        • 功能實現
        • 優化建議
        • 總結

引言

在現代Web開發中,TODO列表應用是一個經典的示例,用于展示如何使用前端技術構建一個簡單的任務管理工具。本文將詳細介紹如何使用React框架和Material-UI庫來構建一個TODO列表應用,并解釋代碼的各個部分,幫助讀者理解其工作原理。

后端API請參考,使用Express.js和SQLite3構建簡單TODO應用的后端API

環境準備

在開始之前,請確保你已經安裝了以下工具和庫:

  1. Node.js:確保你已經安裝了Node.js,可以從Node.js官網下載并安裝。
  2. npm:Node.js的包管理工具,隨Node.js一起安裝。
  3. React:一個用于構建用戶界面的JavaScript庫,可以通過npm安裝。
  4. Material-UI:一個基于Material Design的React組件庫,同樣可以通過npm安裝。
  5. axios:一個基于Promise的HTTP客戶端,用于處理API請求。

安裝所需的依賴:

npm install react @mui/material @emotion/react @emotion/styled axios
代碼解析

讓我們逐步分析代碼,理解每個部分的功能。

1. 導入必要的模塊
import { useState, useEffect } from 'react';
import axios from 'axios';
import {TextField,Button,Checkbox,List,ListItem,ListItemText,IconButton,Dialog,DialogTitle,DialogContent,DialogActions,FormControlLabel
} from '@mui/material';
import { Delete, Edit } from '@mui/icons-material';
import { Todo } from '../types/todo';
  • React:導入useStateuseEffect鉤子,用于狀態管理和副作用處理。
  • axios:用于發送HTTP請求。
  • Material-UI:導入各種組件,如文本框、按鈕、列表、對話框等。
  • Icons:導入刪除和編輯圖標。
  • Todo類型:定義TODO項的類型,確保數據的類型安全。
2. 創建React組件
export default function TodoList() {const [todos, setTodos] = useState<Todo[]>([]);const [searchTerm, setSearchTerm] = useState('');const [newTodo, setNewTodo] = useState({ title: '', description: '' });const [editingTodo, setEditingTodo] = useState<Todo | null>(null);const [editForm, setEditForm] = useState({ title: '', description: '', completed: false });
  • todos:存儲TODO列表的狀態。
  • searchTerm:存儲搜索詞的狀態。
  • newTodo:存儲新TODO項的狀態。
  • editingTodo:存儲正在編輯的TODO項的狀態。
  • editForm:存儲編輯表單的狀態。
3. 定義函數
3.1 獲取TODO列表
const fetchTodos = async () => {try {const response = await axios.get(`http://localhost:3002/api/todos?q=${searchTerm}`);setTodos(response.data);} catch (error) {console.error('Error fetching todos:', error);}
};
  • 功能:從后端獲取TODO列表,支持搜索功能。
  • 實現:使用axios.get發送GET請求,根據searchTerm進行模糊搜索。
3.2 創建TODO項
const createTodo = async () => {if (!newTodo.title.trim()) return;try {await axios.post('http://localhost:3002/api/todos', newTodo);setNewTodo({ title: '', description: '' });fetchTodos();} catch (error) {console.error('Error creating todo:', error);}
};
  • 功能:創建一個新的TODO項。
  • 實現:檢查標題是否為空,使用axios.post發送POST請求,創建成功后清空表單并刷新列表。
3.3 更新TODO項
const updateTodo = async (todo: Todo, isToggleComplete = false) => {try {const updatedTodo = isToggleComplete? { ...todo, completed: !todo.completed }: { ...todo, title: editForm.title, description: editForm.description, completed: editForm.completed };await axios.put(`http://localhost:3002/api/todos/${todo.id}`, updatedTodo);setEditingTodo(null);fetchTodos();} catch (error) {console.error('Error updating todo:', error);}
};
  • 功能:更新TODO項,支持標記完成和編輯內容。
  • 實現:根據isToggleComplete決定是更新完成狀態還是編輯內容,使用axios.put發送PUT請求。
3.4 刪除TODO項
const deleteTodo = async (id: number) => {try {await axios.delete(`http://localhost:3002/api/todos/${id}`);fetchTodos();} catch (error) {console.error('Error deleting todo:', error);}
};
  • 功能:刪除指定的TODO項。
  • 實現:使用axios.delete發送DELETE請求,刪除成功后刷新列表。
3.5 處理編輯點擊事件
const handleEditClick = (todo: Todo) => {setEditingTodo(todo);setEditForm({title: todo.title,description: todo.description || '',completed: todo.completed});
};
  • 功能:打開編輯對話框,填充TODO項的詳細信息。
  • 實現:設置editingTodoeditForm狀態,顯示編輯表單。
3.6 關閉編輯對話框
const handleClose = () => {setEditingTodo(null);setEditForm({ title: '', description: '', completed: false });
};
  • 功能:關閉編輯對話框,重置表單。
  • 實現:清除editingTodoeditForm狀態。
3.7 保存編輯內容
const handleSave = () => {if (editingTodo && editForm.title.trim()) {updateTodo(editingTodo);}
};
  • 功能:保存編輯的內容。
  • 實現:檢查標題是否為空,調用updateTodo更新TODO項。
4. 使用Effect鉤子
useEffect(() => {const debounceSearch = setTimeout(() => {fetchTodos();}, 300);return () => clearTimeout(debounceSearch);
}, [searchTerm]);
  • 功能:實現搜索的防抖動效果,防止頻繁請求。
  • 實現:使用setTimeout延遲300毫秒后執行fetchTodos,并在組件銷毀時清除定時器。
5. 渲染組件
return (<div style={{ maxWidth: 600, margin: '0 auto', padding: '20px' }}><TextFieldfullWidthlabel="Search Todos"variant="outlined"value={searchTerm}onChange={(e) => setSearchTerm(e.target.value)}margin="normal"/><List>{todos.map((todo) => (<ListItemkey={todo.id}secondaryAction={(<><IconButton onClick={() => handleEditClick(todo)}><Edit /></IconButton><IconButton onClick={() => deleteTodo(todo.id)}><Delete /></IconButton></>)}style={{display: todo.completed ? 'none' : 'flex',opacity: todo.completed ? 0.7 : 1}}><Checkboxchecked={Boolean(todo.completed)}onChange={() => updateTodo(todo, true)}/><ListItemTextprimary={todo.title}secondary={todo.description}style={{textDecoration: todo.completed ? 'line-through' : 'none',}}/></ListItem>))}</List><div style={{ display: 'flex', gap: 10, marginBottom: 20 }}><TextFieldfullWidthlabel="New Todo Title"value={newTodo.title}onChange={(e) => setNewTodo({ ...newTodo, title: e.target.value })}/><TextFieldfullWidthlabel="Description"value={newTodo.description}onChange={(e) => setNewTodo({ ...newTodo, description: e.target.value })}/><Buttonvariant="contained"color="primary"onClick={createTodo}>Add</Button></div><Dialog open={Boolean(editingTodo)} onClose={handleClose}><DialogTitle>Edit Todo</DialogTitle><DialogContent><TextFieldautoFocusmargin="dense"label="Title"fullWidthvalue={editForm.title}onChange={(e) => setEditForm({ ...editForm, title: e.target.value })}/><TextFieldmargin="dense"label="Description"fullWidthmultilinerows={3}value={editForm.description}onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}/><FormControlLabelcontrol={(<Checkboxchecked={editForm.completed}onChange={(e) => setEditForm({ ...editForm, completed: e.target.checked })}/>)}label="Completed"/></DialogContent><DialogActions><Button onClick={handleClose} color="primary">Cancel</Button><ButtononClick={handleSave}color="primary"disabled={!editForm.title.trim()}>Save</Button></DialogActions></Dialog></div>
);
  • 搜索框:允許用戶輸入搜索詞,實時搜索TODO列表。
  • TODO列表:顯示所有TODO項,每個項包含標題、描述、編輯和刪除按鈕,以及完成狀態Checkbox。
  • 添加TODO表單:允許用戶輸入新TODO的標題和描述,點擊“Add”按鈕創建。
  • 編輯對話框:當用戶點擊編輯按鈕時,顯示編輯表單,允許修改TODO的標題、描述和完成狀態。
功能實現
  1. 添加TODO項:用戶輸入標題和描述后,點擊“Add”按鈕,發送POST請求到后端,創建新的TODO項。
  2. 編輯TODO項:用戶點擊編輯按鈕,打開編輯對話框,修改TODO項的詳細信息后,點擊“Save”按鈕,發送PUT請求到后端,更新TODO項。
  3. 刪除TODO項:用戶點擊刪除按鈕,發送DELETE請求到后端,刪除指定的TODO項。
  4. 搜索TODO項:用戶輸入搜索詞,組件會自動搜索標題或描述中包含該詞的TODO項,支持防抖動功能,減少請求次數。
  5. 標記完成:用戶點擊Checkbox,TODO項會被標記為完成,樣式會變為灰色并添加刪除線。
優化建議

盡管這段代碼已經可以正常工作,但為了提升應用的性能和用戶體驗,可以考慮以下優化:

  1. 添加加載狀態:在數據加載過程中,顯示加載動畫,提升用戶體驗。
  2. 添加錯誤提示:在請求失敗時,顯示錯誤提示信息,幫助用戶了解問題所在。
  3. 添加成功提示:在創建、更新或刪除TODO項成功后,顯示成功提示信息。
  4. 優化樣式:根據Material Design規范,優化組件的樣式和布局,提升視覺效果。
  5. 添加響應式設計:確保應用在不同設備上都能良好顯示,提升應用的適應性。
  6. 添加數據驗證:在前端和后端都添加數據驗證,確保輸入的數據合法有效。
總結

通過本文,我們詳細解析了一個使用React和Material-UI構建的TODO列表應用。從狀態管理、HTTP請求到組件渲染,每個部分都進行了詳細的解釋。希望這篇文章能夠幫助讀者理解如何使用這些技術構建一個簡單的TODO應用,并為進一步的學習和開發打下基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67903.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯思維訓練營(三)

文章目錄 題目詳解680.驗證回文串 II30.魔塔游戲徒步旅行中的補給問題觀光景點組合得分問題 題目詳解 680.驗證回文串 II 680.驗證回文串 II 思路分析&#xff1a;這個題目的關鍵就是&#xff0c;按照正常來判斷對應位置是否相等&#xff0c;如果不相等&#xff0c;那么就判…

重生之我在異世界學編程之C語言:深入指針篇(上)

大家好&#xff0c;這里是小編的博客頻道 小編的博客&#xff1a;就愛學編程 很高興在CSDN這個大家庭與大家相識&#xff0c;希望能在這里與大家共同進步&#xff0c;共同收獲更好的自己&#xff01;&#xff01;&#xff01; 本文目錄 引言正文&#xff08;1&#xff09;內置數…

密碼學的數學基礎1-素數和RSA加密

數學公式推導是密碼學的基礎, 故開一個新的課題 – 密碼學的數學基礎系列 素數 / 質數 質數又稱素數。 一個大于1的自然數&#xff0c;除了1和它自身外&#xff0c;不能被其他自然數整除的數叫做質數&#xff1b;否則稱為合數&#xff08;規定1既不是質數也不是合數&#xff0…

kamailio源文件modules.lst的內容解釋

在執行make cfg 后&#xff0c;在kamailio/src目錄下有一個文件modules.lst&#xff0c;內容如下&#xff1a; # this file is autogenerated by make modules-cfg# the list of sub-directories with modules modules_dirs:modules# the list of module groups to compile cf…

音視頻入門基礎:RTP專題(7)——RTP協議簡介

一、引言 本文對RTP協議進行簡介。在簡介之前&#xff0c;請各位先下載RTP的官方文檔《RFC 3550》和《RFC 3551》。《RFC 3550》總共有89頁&#xff0c;《RFC 3551》總共有44頁。本文下面所說的“頁數”是指在pdf閱讀器中顯示的頁數&#xff1a; 二、RTP協議簡介 根據《RFC 35…

HTTP協議的無狀態和無連接

無連接 ①無連接的含義 這里所說的無連接并不是指不連接&#xff0c;客戶與服務器之間的HTTP連接是一種一次性連接&#xff0c;它限制每次連接只處理一個請求&#xff0c;當服務器返回本次請求的應答后便立即關閉連接&#xff0c;下次請求再重新建立連接。這種一次性連接主要考…

Java知識速記:Lambda表達式

Java知識速記&#xff1a;Lambda表達式 一、什么是Lambda表達式&#xff1f; Lambda表達式是Java 8引入的一種簡潔的表示函數式接口的方法&#xff0c;它使得可以將函數作為參數傳遞&#xff0c;并且可以在代碼中以更簡潔的方式實現函數式編程。Lambda表達式的基本語法如下&a…

第31章 星騙計劃的推進與團隊協作

我回到自己的辦公室&#xff0c;在座位上剛坐下沒多久&#xff0c;還沒來得及好好整理一下思緒&#xff0c;就聽到一陣敲門聲。“請進。” 我抬頭說道&#xff0c;聲音中帶著一絲疲憊。借助情緒監測系統&#xff0c;我察覺到自己的壓力指數正處于高位&#xff0c;于是暗自提醒自…

半導體器件與物理篇7 微波二極管、量子效應和熱電子器件

基本微波技術 微波頻率&#xff1a;微波頻率涵蓋約從0.1GHz到3000GHz&#xff0c;相當于波長從300cm到0.01cm。 分布效應&#xff1a;電子部件在微波頻率&#xff0c;與其在較低頻率的工作行為不同。 輸運線&#xff1a;一個由電阻、電容、電感三種等效基本電路部件所組成的…

【C++】B2122 單詞翻轉

博客主頁&#xff1a; [小????????] 本文專欄: C 文章目錄 &#x1f4af;前言&#x1f4af;題目描述輸入格式輸出格式樣例 #1樣例輸入 #1樣例輸出 #1 &#x1f4af;一、我的做法代碼實現&#xff1a;代碼解析思路分析 &#x1f4af;二、老師的第一種做法代碼實現&a…

麥芯(MachCore)應用開發教程5 --- 工位和晶圓傳輸

麥芯是構建在windows系統上的設備應用操作系統&#xff0c;利用該系統可以快速高效的開發一款設備專用軟件。希望進一步了解請email: acloud163.com 黃國強 2025/02/03 一、工位與子設備的關系 想象工廠中的流水線工作站&#xff0c;每個工位&#xff08;Station&#xff09…

Python從0到100(八十七):CNN網絡詳細介紹及WISDM數據集模型仿真

前言&#xff1a; 零基礎學Python&#xff1a;Python從0到100最新最全教程。 想做這件事情很久了&#xff0c;這次我更新了自己所寫過的所有博客&#xff0c;匯集成了Python從0到100&#xff0c;共一百節課&#xff0c;幫助大家一個月時間里從零基礎到學習Python基礎語法、Pyth…

C++ Primer 迭代器

歡迎閱讀我的 【CPrimer】專欄 專欄簡介&#xff1a;本專欄主要面向C初學者&#xff0c;解釋C的一些基本概念和基礎語言特性&#xff0c;涉及C標準庫的用法&#xff0c;面向對象特性&#xff0c;泛型特性高級用法。通過使用標準庫中定義的抽象設施&#xff0c;使你更加適應高級…

【C++篇】位圖與布隆過濾器

目錄 一&#xff0c;位圖 1.1&#xff0c;位圖的概念 1.2&#xff0c;位圖的設計與實現 1.5&#xff0c;位圖的應用舉例 1.4&#xff0c;位圖常用應用場景 二&#xff0c;布隆過濾器 2.1&#xff0c;定義&#xff1a; 2.2&#xff0c;布隆過濾器的實現 2.3&#xff0c; 應…

VR觸感數據手套:觸感反饋賦予虛擬交互沉浸式體驗

隨著動作捕捉技術的蓬勃發展&#xff0c;動捕數據手套成為了手部動作捕捉與虛擬交互的便捷工具&#xff0c;為人們打開了通往虛擬世界的新大門。在眾多產品中&#xff0c;mHand Pro作為一款多功能兼具的VR動作捕捉數據手套&#xff0c;憑借其卓越的性能&#xff0c;在手部動作捕…

C# 結構體介紹

.NET學習資料 .NET學習資料 .NET學習資料 一、結構體的定義與基本使用 &#xff08;一&#xff09;定義結構體 在 C# 中&#xff0c;使用struct關鍵字來創建結構體。它就像是一個模板&#xff0c;能定義出符合特定需求的數據結構。比如&#xff0c;若要跟蹤圖書館中書的信息…

圖像噪聲處理技術:讓圖像更清晰的藝術

在這個數字化時代&#xff0c;圖像作為信息傳遞的重要載體&#xff0c;其質量直接影響著我們的視覺體驗和信息解讀。然而&#xff0c;在圖像采集、傳輸或處理過程中&#xff0c;難免會遇到各種噪聲干擾&#xff0c;如高斯噪聲、椒鹽噪聲等&#xff0c;這些噪聲會降低圖像的清晰…

追逐低空經濟,無人機研學技術詳解

追逐低空經濟&#xff0c;無人機研學技術成為了一個備受關注的領域。以下是對無人機研學技術的詳細解析&#xff1a; 一、無人機研學技術概述 無人機研學技術是以無人機為核心&#xff0c;結合航空科技、電子技術、機械原理等多領域知識的一種教育實踐活動。它旨在通過理論學習…

(done) MIT6.S081 2023 學習筆記 (Day7: LAB6 Multithreading)

網頁&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任務1教會了你如何用 C 語言調用匯編&#xff0c;編譯后鏈接即可) 任務1&#xff1a;Uthread: switching between threads (完成) 在這個練習中&#xff0c;你將設計一個用戶級線程系統中的上下文切…

Kubernetes學習之通過Service訪問Pod

一、基礎概述 1.當通過deployment等controller動態創建和銷毀pod使得每個pod都有自己的ip地址&#xff0c;當controller用新的pod替代發生故障的pod時&#xff0c;新的pod會分配到新的ip地址&#xff0c;那么客戶端如何穩定的找到并訪問pod提供的服務。 2.創建service service從…