Let's build this counter application using react-typescript.We are going to use useReducer
hook for this application.
Let's set up our application
$ cd Desktop $ mkdir react-counter $ cd react-counter
Now create a react app
$ npx create-react-app ./ --template typescript
You should see a brand new react application.Clean up all unnecessary files.You can use a different component but in my case i am going to use App.tsx component.
At first create a component App and export it defaultly
const App:React.FunctionComponent=()=>{ return <div className='container'></div> }
Now we are going to setup our useReducer hooks.Add this statement to your code
const [state, dispatch] = React.useReducer(counterReducer, initialState);
Now let's create our cunterReducer and initialState
First initialState..
const initialState = { count: 0, };
And then counterReducer
type ActionsType = { type: string; payload?: number; }; const counterReducer = ( state: typeof initialState, action: ActionsType ): State => { };
Now let's add some actionTypes and actionCreators
ActionTypes..
const INCREMENT = "INCREMENT"; const DECREMENT = "DECREMENT"; const RESET = "RESET";
and actionCreators..
const increment = (value: number) => { return { type: INCREMENT, payload: value, }; }; const decrement = (value: number) => { return { type: DECREMENT, payload: value, }; }; const reset = () => { return { type: RESET, }; };
Yeah i am using redux pattern.Now let's add some logic to our reducer.
switch (action.type) { case INCREMENT: return { ...state, count: state.count + Number(action.payload) }; case DECREMENT: return { ...state, count: state.count -Number(action.payload) }; case RESET: return { ...state, count: 0 }; default: return state; }
Now let's add some jsx to our application
<div className="container"> <p>{state.count}</p> <div className="wrapper"> <button onClick={() => dispatch(increment(2))}>increment</button> <button onClick={() => dispatch(decrement(2))}>decrement</button> <button onClick={() => dispatch(reset())}>reset</button> </div> <div>
If you want those styles you can add these css code in index.css
file
p { font-size: 2rem; font-weight: 600; } button { background: #004567; color: white; border: none; border-radius: 3px; padding: 20px; margin: 10px; font-size: 1.2rem; text-transform: capitalize; } .container { width: 500px; margin: 100px auto; display: flex; flex-direction: column; justify-content: center; align-items: center; }
If you start your application you should see something on the screen a simple counter application working.
Now add a input element to add numbers randomly..
<input type="number" name="count" value={value} onChange={handleChange}/><button onClick={() = dispatch(increment(value as number))}> add </button>
Now where do i get those value={value}
and onChnage={handleChange}
for that add following code at top of your component
const [value, setValue] = React.useState<number>();
and change handler handleChange
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { setValue(Number(e.target.value)); };
you should keep all hooks at the top then functions
Now add these css code for your input element
input { padding: 10px; width: 300px; }
Now if you got to your browser and refresh if it is needed,you should see same counter application as i have shown you at the top.Try to click buttons and check if it is working.
Thank you for being with me so long.See you.Bye!
Top comments (0)