构建 React 费用跟踪应用程序
介绍
在本教程中,我们将使用 React 创建一个 Expense Tracker Web 应用程序。该项目将帮助您了解 React 中的状态管理、事件处理和动态列表更新。对于旨在通过构建实用且有用的应用程序来加强 React 开发知识的初学者来说,它是理想的选择。
项目概况
费用跟踪应用程序允许用户跟踪他们的收入和费用。它通过分类和计算收入、支出和总余额来帮助管理财务数据。该项目展示了如何使用 React 来有效管理状态和处理用户输入。
特征
- 添加交易:用户可以添加收入或支出交易。
- 跟踪余额:用户可以动态查看其总余额并跟踪变化。
- 删除交易:用户可以从列表中删除交易。
- 本地存储:使用 localStorage 在页面重新加载时保留事务。
使用的技术
- React:构建用户界面并管理组件状态。
- CSS:设置应用程序的样式。
- JavaScript:处理应用程序的核心逻辑。
项目结构
项目结构遵循典型的 React 项目布局:
├── public ├── src │ ├── components │ │ ├── TransactionList.jsx │ │ ├── TransactionItem.jsx │ │ ├── AddTransaction.jsx │ ├── App.jsx │ ├── App.css │ ├── index.js │ └── index.css ├── package.json └── README.md
关键部件
- TransactionList.jsx:显示和管理交易列表。
- TransactionItem.jsx:代表单个交易。
- AddTransaction.jsx:处理添加新交易(收入或支出)。
代码说明
交易列表组件
该组件负责显示交易并管理所有交易的状态。
import { useState, useEffect } from "react"; import TransactionItem from "./TransactionItem"; const TransactionList = () => { const [transactions, setTransactions] = useState([]); useEffect(() => { const savedTransactions = JSON.parse(localStorage.getItem("transactions")) || []; setTransactions(savedTransactions); }, []); useEffect(() => { localStorage.setItem("transactions", JSON.stringify(transactions)); }, [transactions]); const deleteTransaction = (index) => { const newTransactions = transactions.filter((_, i) => i !== index); setTransactions(newTransactions); }; return ( <div className="transaction-list"> <h2>Transaction History</h2> <ul> {transactions.map((transaction, index) => ( <TransactionItem key={index} transaction={transaction} deleteTransaction={deleteTransaction} /> ))} </ul> </div> ); }; export default TransactionList;
交易项目组件
TransactionItem 组件代表单个事务,包括删除它的选项。
const TransactionItem = ({ transaction, deleteTransaction }) => { const sign = transaction.amount < 0 ? "-" : "+"; return ( <li className={transaction.amount < 0 ? "expense" : "income"}> {transaction.text} <span>{sign}${Math.abs(transaction.amount)}</span> <button onClick={deleteTransaction}>Delete</button> </li> ); }; export default TransactionItem;
添加交易组件
该组件管理添加新交易,允许用户输入收入或支出数据。
import { useState } from "react"; const AddTransaction = ({ addTransaction }) => { const [text, setText] = useState(""); const [amount, setAmount] = useState(""); const handleSubmit = (e) => { e.preventDefault(); const transaction = { text, amount: +amount }; addTransaction(transaction); setText(""); setAmount(""); }; return ( <div> <h2>Add New Transaction</h2> <form onSubmit={handleSubmit}> <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="Enter description" /> <input type="number" value={amount} onChange={(e) => setAmount(e.target.value)} placeholder="Enter amount" /> <button type="submit">Add Transaction</button> </form> </div> ); }; export default AddTransaction;
应用程序组件
App.jsx 作为应用程序的根,渲染 TransactionList 和 AddTransaction 组件。
import { useState } from "react"; import TransactionList from './components/TransactionList'; import AddTransaction from './components/AddTransaction'; import './App.css'; const App = () => { const [transactions, setTransactions] = useState([]); const addTransaction = (transaction) => { setTransactions([...transactions, transaction]); }; return ( <div className="app"> <h1>Expense Tracker</h1> <TransactionList transactions={transactions} /> <AddTransaction addTransaction={addTransaction} /> <div className="footer"> <p>Made with ❤️ by Abhishek Gurjar</p> </div> </div> ); }; export default App;
CSS 样式
CSS 确保应用程序看起来干净且用户友好。
body { font-family: Arial, sans-serif; background-color: #f4f4f4; } .app { width: 400px; margin: 50px auto; background-color: #fff; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } h1 { text-align: center; } input { width: calc(100% - 10px); padding: 5px; margin-bottom: 10px; } button { width: 100%; padding: 10px; background-color: #007BFF; color: #fff; border: none; cursor: pointer; } button:hover { background-color: #0056b3; } .transaction-list ul { list-style: none; padding: 0; } .transaction-list li { background-color: #f9f9f9; margin: 5px 0; padding: 10px; border-left: 5px solid green; } .transaction-list li.expense { border-left: 5px solid red; } .transaction-list span { float: right; } button { float: right; background-color: red; color: white; padding: 5px; } .footer{ text-align: center; margin: 40px; }
安装与使用
首先,克隆存储库并安装依赖项:
git clone https://github.com/abhishekgurjar-in/expense-tracker.git cd expense-tracker npm install npm start
应用程序将在 http://localhost:3000 开始运行。
现场演示
在此处查看费用跟踪器的现场演示。
结论
Expense Tracker 项目演示了如何在 React 中有效管理列表和状态。这是学习如何使用 localStorage 构建具有持久数据存储的动态应用程序的好方法。
制作人员
- 灵感:旨在帮助用户跟踪其金融交易。
作者
Abhishek Gurjar 是一位专注的 Web 开发人员,热衷于创建实用且功能性的 Web 应用程序。在 GitHub 上查看他的更多项目。
以上是构建 React 费用跟踪应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

不同浏览器对CSS解析存在差异,导致显示效果不一致,主要包括默认样式差异、盒模型计算方式、Flexbox和Grid布局支持程度及某些CSS属性行为不一致。1.默认样式处理不一致,解决方法是使用CSSReset或Normalize.css统一初始样式;2.旧版IE的盒模型计算方式不同,建议统一使用box-sizing:border-box;3.Flexbox和Grid在边缘情况或旧版本中表现有差异,应多测试并使用Autoprefixer;4.某些CSS属性行为不一致,需查阅CanIuse并提供降级

要使用CSS创建响应式图片,主要可通过以下方法实现:1.使用max-width:100%和height:auto让图片在保持比例的同时自适应容器宽度;2.结合HTML的srcset和sizes属性智能加载适配不同屏幕的图片源;3.利用object-fit和object-position控制图片裁剪与焦点展示。这些方法共同确保图片在不同设备上清晰、美观地呈现。

opacity是CSS中用于控制元素整体透明度的属性,取值范围为0(完全透明)到1(完全不透明)。1.常用于图片hover淡出效果,通过设置opacity过渡增强交互体验;2.制作背景遮罩层提升文字可读性;3.控制按钮或图标在禁用状态下的视觉反馈。需注意它会影响所有子元素,且与rgba不同,后者仅影响指定颜色部分。搭配transition可实现平滑动画,但频繁使用可能影响性能,建议结合will-change或transform使用。合理应用opacity能增强页面层次感和交互性,但应避免干扰用户

accent-color是CSS中用于自定义复选框、单选按钮和滑块等表单元素高亮颜色的属性;1.它直接改变表单控件选中状态的默认颜色,如将复选框的蓝色勾选标记改为红色;2.支持的元素包括type="checkbox"、type="radio"和type="range"的输入框;3.使用accent-color可避免复杂的自定义样式和额外DOM结构,保持原生可访问性;4.现代浏览器普遍支持,旧浏览器需降级处理;5.设置accent-col

The:has()pseudo-classinCSSallowstargetingaparentelementbasedonitschildelements.Itworksbyusingthesyntaxparent:has(child-selector)toapplystylesconditionally.Forexample,div:has(img)appliesstylestoadivcontaininganimage.Multipleselectorscanbeusedwithcomma

要美化段落开头提升视觉吸引力,常见做法是使用CSS的伪元素或手动设置文档样式。网页开发中可用p::first-letter设置首字母样式,如放大、加粗、变色,但需注意仅适用于块级元素;若想突出整段首行,则用p::first-line来加样式;在Word等文档软件中可手动调整首字母格式或创建样式模板,而InDesign有内置“首字下沉”功能适合出版设计;应用时需注意细节,如避免复杂样式影响阅读、确保兼容性和格式一致性。

浏览器默认样式通过自动应用边距、填充、字体和表单元素样式确保基本可读性,但可能导致跨浏览器布局不一致。1.默认外边距和填充改变布局流,如标题、段落和列表自带间距;2.默认字体设置影响可读性,如16px字号和TimesNewRoman字体;3.表单元素在不同浏览器显示差异大,需重置外观;4.某些标签如strong和em有默认强调样式,需显式覆盖。解决方法包括使用Normalize.css、重置样式或全局清除边距与填充,同时自定义字体和表单样式以保证一致性。

使用CSS的::selection伪元素可自定义网页文字选中时的高亮样式,提升页面美观与统一性。1.基础设置:通过::selection定义background-color与color,如黄色背景配深灰字体;也可限定特定元素如p::selection。2.兼容处理:添加-webkit-前缀以兼容Safari及移动端浏览器,Firefox和Edge标准支持良好。3.注意可读性:避免颜色对比过强或过于花哨,应与整体设计协调,例如深色模式下选用柔和蓝底提升视觉舒适度。合理运用可增强界面质感,忽略细节则
