Create a Simple Counter in React
Last updated: December 24, 2023.
First, we’ll create a new React project using Vite by running the following from the command line:
npm create vite@latest
After setting a project name (e.g. vite-project) and selecting a React > JavaScript project from the options menu.
cd project-name <# navigates into newly created project-name folder #>
npm install <# installs boilerplate project dependencies #>
code . <# opens files in code editor #>
npm run dev <# starts development server (usually starts on localhost:5173) #>
Creating the counter
As a first step, in App.jsx, we’ll make our application return some static JSX, with a dynamic count value to be added in the next step.
const App = () => {
return (
<div>
<button>-</button>
<span>0</span>
<button>+</button>
</div>
)
};
export default App;
We can create a dynamic count value, we create a count value using the useState() hook, setting its initial value to 0.
count is inserted into the JSX but is not yet updated when the + or - buttons are clicked:
import { useState } from "react";
const App = () => {
const [count, setCount] = useState(0);
return (
<div>
<button>-</button>
<span>{ count }</span>
<button>+</button>
</div>
)
};
export default App;
In a final step, onClick attributes are added to the + and - buttons, calling the increment() and decrement() functions respectively.
Each of these updates count using its updating function, setCount(). And for each a callback function is inserted into it, in which the current value of count is automatically available as a parameter. The return value of this plus or minus one determines the new value of count when a rerender is triggered by the updating of this state value.
import { useState } from "react";
const App = () => {
const [count, setCount] = useState(0);
const increment = () => {
setCount(prevCount => prevCount + 1);
};
const decrement = () => {
setCount(prevCount => prevCount - 1);
};
return (
<div>
<button onClick={ decrement }>-</button>
<span>{ count }</span>
<button onClick={ increment }>+</button>
</div>
)
};
export default App;





