nextjs : Click side-menu button , reload after the second time

1. Click side-menu button , reload after the second time

2. Seide-menu button
– For example, click Cancellation list twice

3. modules
next@12.3.0
react@18.2.0

4. Contents
(1) Reason for loading only the first time
(2) Changes for reloading after the second time
(3) Create a selected_class on the side-menu
(4) Component of side-menu
(5) SideMenuItems

5. Reason for loading only the first time
– Set to Show only the first time in the Display component

  useEffect(() => {
    func.getCancellationList(setRows); <--- get Data
  }, []);

6. Changes for reloading after the second time
– add counter

import { useRouter } from 'next/router'
...
 const router = useRouter();
 useEffect(() => {
    func.getCancellationList(setRows); 
 }, [router.query.counter]);  <---- change

7. Create a selected_class on the side-menu
– create selected_class
– increment a counter
– path is set in textContent
– set query
– do not display queries
– file: SideMenu.tsx

const selected = new selected_class();

function selected_class() {
  this.target = null;
  this.setTarget = (target) => this.target = target;
  this.getTarget = () => this.target;
  this.item = item.bind(this);
  this.counter = 0;
  return this;

  async function item(target,router, item) {

    const old_target = await this.getTarget();

    if (old_target == null) {
        selected.counter = 0;
    } else {
        if (old_target.textContent != target.textContent) {
            selected.counter = 0;
        } else {
            selected.counter++;
        }
    }

    await router.push(
        { 
            pathname: (item.path),
            query: {counter: selected.counter }  <--- set query
        },
        item.path,    <---- do not display queries
    );

    this.setTarget(target);
  }
}

8. Component of side-menu
– call selected.item
– file: SideMenu.tsx

import { useRouter } from 'next/router'

export const SideMenu = () => {
  const router = useRouter();
  ....
  return (
    <div>
    {sideMenuItems.map((item) => (
    ....
      <button
        onClick={(e) => {
          selected.item(e.target, router, item)
        }}  
      /> 
    </div>
  )
}

9. SideMenuItems

  SideMenuItems: [
    {
      key: 1,
      name: "Dashboard",
      icon: MdDashboard,
      path: "../Dashboard/",
    },
    {
       key: 2,
       name: "Today\'s rental",
       icon: RiRidingLine,
       path: "../RentalStatus/",
    },
    {
       key: 3,
       name: "Tomorrow ",
       icon: BiCalendar,
       path: "../Tomorrow/",
    },
    {
        key: 4,
        name: "After tomorrow",
        icon: BiCalendar,
        path: "../AfterTomorrow/",
    },
  ...
  }