React is an easy to use JavaScript framework that lets us create front end apps.
In this article, we’ll look at how to create a budget tracker app with React and JavaScript.
Create the Project
We can create the React project with Create React App.
To install it, we run:
npx create-react-app budget-tracker
with NPM to create our React project.
We need the uuid to let us create unique IDs for our to-do items easily.
To add it, we run:
npm i uuidv4
Create the Grocery List App
To create the grocery list app, we write:
import { useMemo, useState } from "react";
import { v4 as uuidv4 } from "uuid";
export default function App() {
const [budget, setBudget] = useState("");
const [expense, setExpense] = useState({});
const [expenses, setExpenses] = useState([]);
const add = (e) => {
e.preventDefault();
const { cost, description } = expense;
const formValid = +budget > 0 && +cost > 0 && description;
if (!formValid) {
return;
}
setExpenses((ex) => [
...ex,
{
id: uuidv4(),
...expense
}
]);
};
const remove = (index) => {
setExpenses((expenses) => expenses.filter((_, i) => i !== index));
};
const remainingBudget = useMemo(() => {
const totalExpenses = expenses
.map(({ cost }) => +cost)
.reduce((a, b) => +a + +b, 0);
return budget - totalExpenses;
}, [budget, expenses]);
return (
<div className="App">
<div>
<form>
<fieldset>
<label>budget</label>
<input value={budget} onChange={(e) => setBudget(e.target.value)} />
</fieldset>
</form>
<form onSubmit={add}>
<h1>add expensse</h1>
<fieldset>
<label>description</label>
<input
value={expense.description}
onChange={(e) =>
setExpense((ex) => ({ ...ex, description: e.target.value }))
}
/>
</fieldset>
<fieldset>
<label>cost</label>
<input
value={expense.cost}
onChange={(e) =>
setExpense((ex) => ({ ...ex, cost: e.target.value }))
}
/>
</fieldset>
<button type="submit">add expense</button>
</form>
<p>remaining budget: ${remainingBudget}</p>
{expenses.map((ex, index) => {
return (
<div key={ex.id}>
{ex.description} - ${ex.cost}
<button onClick={() => remove(index)}>remove</button>
</div>
);
})}
</div>
</div>
);
}
We have the budget , expense , and expenses states.
budget has the budget number.
expense has the expense item.
expenses has the expense items.
Then add the add method that lets us add an expense item.
In it, we call e.preventDefault() to let us to client-side submission.
Then we check if the expense properties are valid with the formValid variable.
If it’s true , then we call setExpenses with a callback to return an expenses array with the new item appended to it.
In the remove method, we call setExpenses with a callback that returns the expenses array without the item with the given index .
Next, we add the remainingBudget state that we create with useMemo .
In the callback, we add up all the cost values from the expenses array together to get totalExpenses .
Then we subtract budget by totalExpenses.
We watch budget and expenses for changes as indicated by the array in the 2nd argument.
In the return statement, we have a form to let us enter the budget value.
In the 2nd form, we can enter values for the expense properties.
We set the value and onChange props so that we can set the properties.
To set a property value with the input, we use spread to spread the existing values in the return object, then we add the property we want to change set to e.target.value at the end.
Below that, we display the remainingBudget value.
And below that, we display the expenses items as divs.
The button inside calls remove with the index to remove an item when we click it.
Conclusion
We can create a simple budget app with React and JavaScript.