React從基礎入門到高級實戰:React 實戰項目 - 項目一:在線待辦事項應用

React 實戰項目:在線待辦事項應用

歡迎來到本 React 開發教程專欄的第 26 篇!在之前的 25 篇文章中,我們從 React 的基礎概念逐步深入到高級技巧,涵蓋了組件、狀態、路由和性能優化等核心知識。這一次,我們將通過一個完整的實戰項目——在線待辦事項應用,將這些知識融會貫通,幫助您從理論走向實踐。

本項目的目標是為初學者提供一個簡單但全面的 React 開發體驗。通過這個項目,您將學習如何分析需求、選擇技術棧、實現功能并最終將應用部署到線上。無論您是剛剛接觸 React 的新手,還是希望通過實踐鞏固基礎的開發者,這篇文章都將為您提供清晰的指引和豐富的代碼示例。


引言

React 是一個強大的前端框架,其聲明式編程和組件化特性讓開發者能夠高效地構建用戶界面。然而,僅僅理解理論是不夠的——真正的學習發生在實踐中。在本項目中,我們將構建一個在線待辦事項應用,這是一個經典的入門案例,既簡單又實用,能夠幫助您掌握 React 的核心技能。

這個應用的目標非常明確:允許用戶創建、編輯和刪除待辦事項,支持按狀態過濾,并將數據保存在本地,確保刷新頁面后不會丟失。我們將從需求分析開始,逐步完成技術選型、代碼實現和部署上線,并在最后提供一個練習,幫助您進一步鞏固所學內容。

通過這個項目,您將體驗到:

  • 組件化思維:如何將復雜的界面拆分為可重用的模塊。
  • 狀態管理:如何在應用中高效地共享和更新數據。
  • 路由設計:如何實現多頁面導航。
  • 數據持久化:如何使用本地存儲保存用戶數據。

準備好了嗎?讓我們開始吧!


需求分析

在動手寫代碼之前,我們需要明確這個待辦事項應用的具體功能需求。一個清晰的需求清單不僅能指導開發過程,還能幫助我們理解每個功能的意義。以下是我們項目的核心需求:

  1. 創建待辦事項
    用戶可以輸入任務描述并添加到待辦列表中。
  2. 編輯待辦事項
    用戶可以修改已有任務的內容。
  3. 刪除待辦事項
    用戶可以移除不再需要的任務。
  4. 過濾待辦事項
    用戶可以根據任務狀態(全部、已完成、未完成)篩選列表。
  5. 數據持久化
    數據將保存在瀏覽器本地存儲中,刷新頁面后依然可用。

為什么選擇這些功能?

這些功能覆蓋了待辦事項應用的核心場景,同時也為學習 React 提供了豐富的實踐機會:

  • 創建和編輯涉及表單處理和事件監聽。
  • 刪除和過濾需要掌握狀態更新和數組操作。
  • 本地存儲引入了數據持久化的概念。

此外,這些功能簡單直觀,非常適合初學者上手,同時也為后續擴展(如添加分類、優先級等)留下了空間。


技術棧選擇

在開始實現之前,我們需要選擇合適的技術棧。以下是本項目使用的工具和技術,以及選擇它們的理由:

  • React
    核心框架,用于構建用戶界面。React 的組件化和聲明式編程讓開發過程更加直觀。
  • Vite
    構建工具,提供快速的開發服務器和高效的打包能力。相比傳統的 Create React App,Vite 的啟動速度更快,熱更新體驗更優。
  • React Router
    用于實現頁面導航。雖然待辦事項應用可以是單頁應用,但我們將通過多頁面設計展示路由的用法。
  • Context API
    React 內置的狀態管理工具,用于在組件間共享待辦事項數據。相比 Redux,它更輕量,適合小型項目。

技術棧的優勢

  • React:生態豐富,學習曲線平滑,是現代前端開發的標配。
  • Vite:2025 年的前端開發趨勢偏向輕量化和高性能,Vite 代表了這一方向。
  • React Router:支持動態路由和參數傳遞,是多頁面應用的理想選擇。
  • Context API:無需引入外部依賴,簡單易用,適合初學者理解狀態管理。

這些工具的組合不僅易于上手,還能幫助您掌握現代 React 開發的精髓。


項目實現

現在,我們進入最核心的部分——代碼實現。我們將從項目搭建開始,逐步完成組件拆分、路由設計、狀態管理和本地存儲的開發。

1. 項目搭建

首先,使用 Vite 創建一個新的 React 項目:

npm create vite@latest todo-app -- --template react
cd todo-app
npm install
npm run dev

安裝必要的依賴:

npm install react-router-dom

這將啟動一個基礎的 React 項目,接下來我們將逐步實現功能。

2. 組件拆分

組件化是 React 的核心思想。通過將應用拆分為多個小組件,我們可以提高代碼的可讀性和復用性。

組件結構
  • App:根組件,負責路由配置和整體布局。
  • TodoList:顯示待辦事項列表,包含過濾功能。
  • TodoItem:展示單個待辦事項,支持編輯和刪除。
  • TodoForm:用于添加或編輯待辦事項的表單。
  • FilterButtons:提供狀態過濾選項。
文件結構
src/
├── components/
│   ├── TodoList.jsx
│   ├── TodoItem.jsx
│   ├── TodoForm.jsx
│   └── FilterButtons.jsx
├── context/
│   └── TodoContext.jsx
├── App.jsx
└── main.jsx

3. 路由設計

我們將應用設計為多頁面結構,使用 React Router 實現導航。

路由配置
  • /:首頁,顯示待辦事項列表。
  • /add:添加待辦事項頁面。
  • /edit/:id:編輯指定待辦事項頁面。

App.jsx 中配置路由:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import TodoList from './components/TodoList';
import TodoForm from './components/TodoForm';
import { TodoProvider } from './context/TodoContext';function App() {return (<TodoProvider><Router><div className="min-h-screen bg-gray-100 p-4"><Routes><Route path="/" element={<TodoList />} /><Route path="/add" element={<TodoForm />} /><Route path="/edit/:id" element={<TodoForm />} /></Routes></div></Router></TodoProvider>);
}export default App;
導航鏈接

TodoList 中添加導航到添加頁面的按鈕:

import { Link } from 'react-router-dom';function TodoList() {return (<div><h1 className="text-2xl font-bold mb-4">待辦事項</h1><Link to="/add" className="bg-blue-500 text-white px-4 py-2 rounded">添加任務</Link>{/* 列表內容 */}</div>);
}export default TodoList;

4. 狀態管理

我們使用 Context API 管理全局狀態,包括待辦事項列表和過濾條件。

創建 Context

src/context/TodoContext.jsx 中:

import { createContext, useState, useEffect } from 'react';export const TodoContext = createContext();export function TodoProvider({ children }) {const [todos, setTodos] = useState([]);const [filter, setFilter] = useState('all');// 加載本地存儲數據useEffect(() => {const storedTodos = JSON.parse(localStorage.getItem('todos')) || [];setTodos(storedTodos);}, []);// 保存數據到本地存儲useEffect(() => {localStorage.setItem('todos', JSON.stringify(todos));}, [todos]);return (<TodoContext.Provider value={{ todos, setTodos, filter, setFilter }}>{children}</TodoContext.Provider>);
}
使用 Context

TodoList 中訪問和過濾數據:

import { useContext } from 'react';
import { TodoContext } from '../context/TodoContext';
import TodoItem from './TodoItem';
import FilterButtons from './FilterButtons';function TodoList() {const { todos, filter } = useContext(TodoContext);const filteredTodos = todos.filter((todo) => {if (filter === 'completed') return todo.completed;if (filter === 'incomplete') return !todo.completed;return true;});return (<div><h1 className="text-2xl font-bold mb-4">待辦事項</h1><Link to="/add" className="bg-blue-500 text-white px-4 py-2 rounded mb-4 inline-block">添加任務</Link><FilterButtons /><ul className="space-y-2">{filteredTodos.map((todo) => (<TodoItem key={todo.id} todo={todo} />))}</ul></div>);
}export default TodoList;

5. 組件實現

TodoItem

TodoItem.jsx 中實現單個待辦事項的展示和操作:

import { useContext } from 'react';
import { Link } from 'react-router-dom';
import { TodoContext } from '../context/TodoContext';function TodoItem({ todo }) {const { todos, setTodos } = useContext(TodoContext);const toggleComplete = () => {setTodos(todos.map((t) =>t.id === todo.id ? { ...t, completed: !t.completed } : t));};const deleteTodo = () => {setTodos(todos.filter((t) => t.id !== todo.id));};return (<li className="flex items-center justify-between p-2 bg-white rounded shadow"><div className="flex items-center"><inputtype="checkbox"checked={todo.completed}onChange={toggleComplete}className="mr-2"/><span className={todo.completed ? 'line-through text-gray-500' : ''}>{todo.text}</span></div><div><Linkto={`/edit/${todo.id}`}className="text-blue-500 mr-2">編輯</Link><button onClick={deleteTodo} className="text-red-500">刪除</button></div></li>);
}export default TodoItem;
TodoForm

TodoForm.jsx 中實現添加和編輯表單:

import { useState, useContext, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { TodoContext } from '../context/TodoContext';function TodoForm() {const { todos, setTodos } = useContext(TodoContext);const { id } = useParams();const navigate = useNavigate();const [text, setText] = useState('');useEffect(() => {if (id) {const todo = todos.find((t) => t.id === id);if (todo) setText(todo.text);}}, [id, todos]);const handleSubmit = (e) => {e.preventDefault();if (!text.trim()) return;if (id) {// 編輯setTodos(todos.map((t) => (t.id === id ? { ...t, text } : t)));} else {// 添加const newTodo = {id: Date.now().toString(),text,completed: false,};setTodos([...todos, newTodo]);}navigate('/');};return (<div><h1 className="text-2xl font-bold mb-4">{id ? '編輯任務' : '添加任務'}</h1><form onSubmit={handleSubmit}><inputtype="text"value={text}onChange={(e) => setText(e.target.value)}className="w-full p-2 border rounded mb-4"placeholder="請輸入任務描述"/><buttontype="submit"className="bg-blue-500 text-white px-4 py-2 rounded">保存</button></form></div>);
}export default TodoForm;
FilterButtons

FilterButtons.jsx 中實現過濾按鈕:

import { useContext } from 'react';
import { TodoContext } from '../context/TodoContext';function FilterButtons() {const { filter, setFilter } = useContext(TodoContext);return (<div className="mb-4"><buttononClick={() => setFilter('all')}className={`mr-2 px-4 py-2 rounded ${filter === 'all' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>全部</button><buttononClick={() => setFilter('completed')}className={`mr-2 px-4 py-2 rounded ${filter === 'completed' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>已完成</button><buttononClick={() => setFilter('incomplete')}className={`px-4 py-2 rounded ${filter === 'incomplete' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>未完成</button></div>);
}export default FilterButtons;

6. 本地存儲

本地存儲已在 TodoContext 中實現,通過 localStorage 保存和加載數據,確保刷新頁面后數據不會丟失。


部署

開發完成后,我們將應用部署到 Netlify,讓它在線上運行。

1. 構建項目

運行以下命令生成靜態文件:

npm run build

這會生成 dist 文件夾,包含應用的靜態資源。

2. 部署到 Netlify

  1. 注冊 Netlify:訪問 Netlify 官網 并創建賬號。
  2. 新建站點:在控制臺選擇“New site from Git”。
  3. 連接倉庫:將項目推送至 GitHub 并連接。
  4. 配置構建
    • 構建命令:npm run build
    • 發布目錄:dist
  5. 部署:點擊“Deploy site”,等待部署完成。

部署成功后,您將獲得一個唯一的 URL,可以通過它訪問您的待辦事項應用。


練習:添加分類功能

為了幫助您鞏固所學,我們設計了一個練習:為待辦事項添加分類功能。

需求

  • 用戶可以為任務指定分類(如“工作”、“個人”、“學習”)。
  • 用戶可以按分類過濾任務。

實現步驟

  1. 擴展數據結構
    todos 中為每個任務添加 category 字段。
  2. 更新 TodoForm
    添加分類選擇下拉菜單。
  3. 更新過濾邏輯
    TodoListFilterButtons 中支持分類過濾。

示例代碼

修改 TodoContext
export function TodoProvider({ children }) {const [todos, setTodos] = useState([]);const [filter, setFilter] = useState('all');useEffect(() => {const storedTodos = JSON.parse(localStorage.getItem('todos')) || [];setTodos(storedTodos);}, []);useEffect(() => {localStorage.setItem('todos', JSON.stringify(todos));}, [todos]);return (<TodoContext.Provider value={{ todos, setTodos, filter, setFilter }}>{children}</TodoContext.Provider>);
}
修改 TodoForm
function TodoForm() {const { todos, setTodos } = useContext(TodoContext);const { id } = useParams();const navigate = useNavigate();const [text, setText] = useState('');const [category, setCategory] = useState('工作');useEffect(() => {if (id) {const todo = todos.find((t) => t.id === id);if (todo) {setText(todo.text);setCategory(todo.category);}}}, [id, todos]);const handleSubmit = (e) => {e.preventDefault();if (!text.trim()) return;if (id) {setTodos(todos.map((t) =>t.id === id ? { ...t, text, category } : t));} else {const newTodo = {id: Date.now().toString(),text,category,completed: false,};setTodos([...todos, newTodo]);}navigate('/');};return (<div><h1 className="text-2xl font-bold mb-4">{id ? '編輯任務' : '添加任務'}</h1><form onSubmit={handleSubmit}><inputtype="text"value={text}onChange={(e) => setText(e.target.value)}className="w-full p-2 border rounded mb-4"placeholder="請輸入任務描述"/><selectvalue={category}onChange={(e) => setCategory(e.target.value)}className="w-full p-2 border rounded mb-4"><option value="工作">工作</option><option value="個人">個人</option><option value="學習">學習</option></select><buttontype="submit"className="bg-blue-500 text-white px-4 py-2 rounded">保存</button></form></div>);
}
修改 TodoList 和 FilterButtons
function TodoList() {const { todos, filter } = useContext(TodoContext);const filteredTodos = todos.filter((todo) => {if (filter === 'completed') return todo.completed;if (filter === 'incomplete') return !todo.completed;if (['工作', '個人', '學習'].includes(filter)) return todo.category === filter;return true;});return (<div><h1 className="text-2xl font-bold mb-4">待辦事項</h1><Link to="/add" className="bg-blue-500 text-white px-4 py-2 rounded mb-4 inline-block">添加任務</Link><FilterButtons /><ul className="space-y-2">{filteredTodos.map((todo) => (<TodoItem key={todo.id} todo={todo} />))}</ul></div>);
}function FilterButtons() {const { filter, setFilter } = useContext(TodoContext);return (<div className="mb-4 flex flex-wrap gap-2"><buttononClick={() => setFilter('all')}className={`px-4 py-2 rounded ${filter === 'all' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>全部</button><buttononClick={() => setFilter('completed')}className={`px-4 py-2 rounded ${filter === 'completed' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>已完成</button><buttononClick={() => setFilter('incomplete')}className={`px-4 py-2 rounded ${filter === 'incomplete' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>未完成</button><buttononClick={() => setFilter('工作')}className={`px-4 py-2 rounded ${filter === '工作' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>工作</button><buttononClick={() => setFilter('個人')}className={`px-4 py-2 rounded ${filter === '個人' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>個人</button><buttononClick={() => setFilter('學習')}className={`px-4 py-2 rounded ${filter === '學習' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}>學習</button></div>);
}

練習目標

通過這個練習,您將學會如何擴展現有功能,提升對狀態管理和組件通信的理解。


注意事項

  • 初學者友好:本文避免了復雜的概念,所有代碼都盡量保持簡單直觀。
  • 學習建議:建議您邊閱讀邊動手實現,遇到問題時查閱 React 官方文檔和Vite 文檔。
  • 擴展思路:完成項目后,可以嘗試添加更多功能,如任務優先級、截止日期或提醒功能。

結語

通過這個在線待辦事項應用項目,您從需求分析到部署上線,完整地走過了一個 React 項目的開發流程。您學習了組件拆分、路由設計、狀態管理和數據持久化等核心技能,這些知識將成為您未來開發更復雜應用的基礎。

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

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

相關文章

1991-2024年上市公司個股換手率數據

1991-2024年上市公司個股換手率數據 1、時間&#xff1a;1991-2024年 2、來源&#xff1a;上海證券交易所和深圳證券交易所 3、指標&#xff1a;證券代碼、交易年份、開始日期、截止日期、年換手率(流通股數)(%)、年換手率(總股數)(%)、日均換手率(流通股數)(%)、日均換手率…

RAID存儲技術概述

1 數據存儲架構 數據存儲架構是對數據存儲方式、存儲設備及相關組件的組織和規劃&#xff0c;涵蓋存儲系統的布局、數據存儲策略等&#xff0c;它明確數據如何存儲、管理與訪問&#xff0c;為數據的安全、高效使用提供支撐。 1.1 存儲系統 存儲系統是計算機的重要組成部分之…

LRU 和 DiskLRU實現相冊緩存器

我是寫Linux后端的&#xff08;golang、c、py&#xff09;&#xff0c;后端緩存算法通常是指的是內存里面的lru、或diskqueue&#xff0c;都是獨立使用。 很少有用內存lru與disklru結合的場景需求。近段時間研究android開發&#xff0c;里面有一些設計思想值得后端學習。 寫這…

可視化預警:如何讓生產風險預警更高效?

你有沒有遇到過這種情況&#xff1f; 明明設備已經開始發熱報警&#xff0c;但操作人員還在繼續運行&#xff1b; 或者某個參數已經接近危險值&#xff0c;卻沒人注意到&#xff1b; 甚至問題早就埋下了隱患&#xff0c;只是當時沒發現…… 這些情況的背后&#xff0c;其實都…

【MPC-C++】qpOASES 源碼編譯與鏈接,編譯器設置細節

qpOASES 源碼編譯與鏈接 克隆源碼 git clone https://github.com/coin-or/qpOASES.gitcd qpOASES mkdir build cd build接下來是構建&#xff0c;有一些細節。 查看 CMakeLists.txt&#xff0c;發現如果不顯示指定 CMAKE_BUILD_TYPE 構建版本&#xff0c;會自動編譯 Release…

【11408學習記錄】考研數學攻堅:行列式本質、性質與計算全突破

行列式 數學線性代數一、對象&#xff08;元素&#xff09;&#xff1a;向量二、運算三、行列式3.1 第一種定義——行列式的本質定義3.2 行列式的性質性質1&#xff1a;行列互換&#xff0c;其值不變性質2&#xff1a;若行列式中某行&#xff08;列&#xff09;元素全為零&…

Qt/C++開發監控GB28181系統/取流協議/同時支持udp/tcp被動/tcp主動

一、前言說明 在2011版本的gb28181協議中&#xff0c;拉取視頻流只要求udp方式&#xff0c;從2016開始要求新增支持tcp被動和tcp主動兩種方式&#xff0c;udp理論上會丟包的&#xff0c;所以實際使用過程可能會出現畫面花屏的情況&#xff0c;而tcp肯定不丟包&#xff0c;起碼…

小木的算法日記-線段樹

&#x1f333; 線段樹 &#xff08;Segment Tree&#xff09;&#xff1a;玩轉區間作的終極利器 你好&#xff0c;未來的算法大師&#xff01; 想象一下&#xff0c;你正在處理一個巨大的數據集&#xff0c;比如某個電商網站一整天的用戶點擊流。老板突然問你&#xff1a;“下…

Day24 元組和OS模塊

1、元組&#xff08;有序 不可變 可重復&#xff09; 管道工程中pipeline類接收的是一個包含多個小元組的列表作為輸入。可以這樣理解這個結構&#xff1a; &#xff08;1&#xff09; 列表 []: 定義了步驟執行的先后順序。Pipeline 會按照列表中的順序依次處理數據。之所以用列…

Auto-Coder使用GPT-4o完成:在用TabPFN這個模型構建一個預測未來3天漲跌的分類任務

通過akshare庫&#xff0c;獲取股票數據&#xff0c;并生成TabPFN這個模型 可以識別、處理的格式&#xff0c;寫一個完整的預處理示例&#xff0c;并構建一個預測未來 3 天股價漲跌的分類任務 用TabPFN這個模型構建一個預測未來 3 天股價漲跌的分類任務&#xff0c;進行預測并輸…

Device Mapper 機制

Device Mapper 機制詳解 Device Mapper&#xff08;簡稱 DM&#xff09;是 Linux 內核中的一套通用塊設備映射框架&#xff0c;為 LVM、加密磁盤、RAID 等提供底層支持。本文將詳細介紹 Device Mapper 的原理、實現、內核配置、常用工具、操作測試流程&#xff0c;并配以詳細的…

crackme006

crackme006 名稱值軟件名稱aLoNg3x.1.exe加殼方式無保護方式Serial編譯語言Delphi調試環境Win10 64位使用工具x32dbg,ida pro,PEid,DarkDe4破解日期2025-06-05 脫殼 1. 先用PEid查殼 查到無殼 尋找Serial 查詢到編程語言為Delphi 導出Delphi符號表信息到x32dbg&#xff0c…

Conda 創建新環境時報錯 HTTP 502,如何解決?

Conda 創建新環境時報錯 HTTP 502&#xff0c;如何解決&#xff1f; 最近在用 Conda 創建新環境時&#xff0c;突然遇到這樣一個錯誤&#xff1a; CondaHTTPError: HTTP 502 BAD GATEWAY for url <https://mirrors.westlake.edu.cn/ANACONDA/cloud/conda-forge/linux-64/r…

2025最全TS手寫題之partial/Omit/Pick/Exclude/Readonly/Required

隨著 TS 在工作中使用的越來越廣泛&#xff0c;面試的時候面試官也都會加上一兩個 TS 的問題來了解候選人對于 TS 的熟悉程度&#xff0c;其中就有不少手寫題目&#xff0c;比如筆者在字節的一次二面&#xff0c;面試官就問到了我如何實現一個 Pick&#xff0c;在小紅書的一面&…

基于江科大stm32屏幕驅動,實現OLED多級菜單(動畫效果),結構體鏈表實現(獨創源碼)

引言 在嵌入式系統中&#xff0c;用戶界面的設計往往直接影響到用戶體驗。本文將以STM32微控制器和OLED顯示屏為例&#xff0c;介紹如何實現一個多級菜單系統。該系統支持用戶通過按鍵導航菜單&#xff0c;執行相應操作&#xff0c;并提供平滑的滾動動畫效果。 本文設計了一個…

LLMs之StructuredOutput:大模型結構化輸出的簡介、常用方案、前沿框架之詳細攻略

LLMs之StructuredOutput&#xff1a;大模型結構化輸出的簡介、常用方案、前沿框架之詳細攻略 目錄 大模型結構化輸出的簡介 1、特點與難點 大模型結構化輸出的常用方案及對比 1、前沿框架&#xff1a;vLLM 與 XGrammar 大模型結構化輸出的案例應用 大模型結構化輸出的簡介…

Linux中shell流程控制語句

一、if條件控制 1.1 語法解讀 單路決策 - 單分支if語句樣式&#xff1a;if [ 條件 ]then指令fi特點&#xff1a;單一條件&#xff0c;只有一個輸出 雙路決策 - 雙分支if語句樣式&#xff1a;if [ 條件 ]then指令1else指令2fi特點&#xff1a;單一條件&#xff0c;兩個輸出 …

Python學習(8) ----- Python的類與對象

Python 中的類&#xff08;Class&#xff09;與對象&#xff08;Object&#xff09;是面向對象編程&#xff08;OOP&#xff09;的核心。我們可以通過“類是模板&#xff0c;對象是實例”來理解它們的關系。 &#x1f9f1; 一句話理解&#xff1a; 類就像“圖紙”&#xff0c;對…

數據結構-文件

文件是性質相同的記錄的集合。 記錄是文件中存取的基本單位&#xff0c;數據項是文件可使用的最小單位。 操作系統研究的文件是一維的無結構連續字符序列&#xff0c;數據庫中研究的文件是帶有結構的記錄集合。 文件在外存上的4種基本組織方式&#xff1a;順序、索引、散列、鏈…

前端開發面試題總結-CSS篇

文章目錄 CSS面試高頻問答1、CSS選擇器的優先級2、CSS3新特性3、如何垂直水平居中盒子4、什么是重繪和重排5、px/em/rem/vw有什么區別6、rem布局的原理7、如何設置比12px還要小的字體8、CSS中隱藏元素的方式有哪些 CSS面試高頻問答 1、CSS選擇器的優先級 2、CSS3新特性 3、如何…