Teachnique
      CourseRoadmaps
      Login

      useStateuseEffectuseLayoutEffectuseReduceruseRefforwardRefuseContextClosure Trap in Hooks

      Feedback

      Submit request if you have any questions.

      Course
      useReducer

      React Mastery Guide

      Unlock the full potential of React with our comprehensive guide. From basics to advanced techniques, this course covers everything you need to build dynamic, high-performance web applications. Perfect for developers at any level, start mastering React today!

      useReducer


      
      Previously, we used setState to directly modify values.
      But what if we need to execute some logics before updating the value?
      
      This is where useReducer comes in:
      import React, { Reducer, useEffect, useReducer, useState } from 'react';
      import './App.css';
      
      interface Data {
      result: number;
      }
      
      interface Action {
      type: 'add' | 'minus',
      num: number
      }
      function reducer(state: Data, action: Action) {
      
      switch (action.type) {
      case 'add':
      return {
      result: state.result + action.num
      }
      case 'minus':
      return {
      result: state.result - action.num
      }
      }
      return state;
      }
      
      function App() {
      const [res, dispatch] = useReducer<Reducer<Data, Action>>(reducer, { result: 0 });
      
      return (
      <>
      <h1>React Hooks</h1>
      <div className="card">
      <p>count is {res.result}</p>
      <div className="button-container">
      <button onClick={() => dispatch({ type: 'add', num: 2 })}>Add</button>
      <button onClick={() => dispatch({ type: 'minus', num: 1 })}>Minus</button>
      </div>
      <p>
      Edit <code>src/App.tsx</code> and save to test Hooks
      </p>
      </div>
      <p className="read-the-docs">
      Click on the Vite and React logos to learn more
      </p>
      </>
      );
      }
      
      export default App;
      
      Let's try it out!
      
      
      For useReducer, you pass type parameters like Reducer<type of data, type of action>.
      The first argument is the reducer function, and the second argument is the initial state.
      When you click "add," it triggers the "add" action, and when you click "minus," it triggers the "minus" action.
      
      Of course, you can also use setState directly:
      import { useState } from 'react';
      import './App.css';
      
      function App() {
      const [res, setRes] = useState({ result: 0});
      
      return (
      <>
      <h1>React Hooks</h1>
      <div className="card">
      <p>count is {res.result}</p>
      <div className="button-container">
      <button onClick={() => setRes({ result: res.result + 2 })}>Add</button>
      <button onClick={() => setRes({ result: res.result - 1 })}>Minus</button>
      </div>
      <p>
      Edit <code>src/App.tsx</code> and save to test Hooks
      </p>
      </div>
      <p className="read-the-docs">
      Click on the Vite and React logos to learn more
      </p>
      </>
      );
      }
      
      export default App;
      
      
      Some might argue that useState is much simpler than useReducer.
      Indeed, for simple examples, useReducer might be unnecessary.
      
      But what if the logic is more complex?
      With useState, you would need to repeat the logic in every place where the state is updated, while useReducer allows you to encapsulate this logic within the reducer and trigger it via actions.
      When the logic for modifying the state is complex, use useReducer.