Advertisement
arlendafitranto

Onclick_in_React

Sep 23rd, 2024
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 2.52 KB | Source Code | 0 0
  1. import { useEffect, useState } from "react";
  2. import DataTable from "datatables.net-react";
  3. import DT from "datatables.net-bs5";
  4.  
  5. DataTable.use(DT);
  6.  
  7. export default function Table() {
  8.     const [users, setUsers] = useState(null);
  9.  
  10.     const columns = [
  11.         { data: "name" },
  12.         { data: "email" },
  13.         { data: "created_at" },
  14.         {
  15.             data: null,
  16.             render: function (data, type, row) {
  17.                 return `<button class="btn btn-sm btn-primary view-btn" data-id="${data.id}">View</button>`;
  18.             },
  19.         },
  20.     ];
  21.  
  22.     const getAllUser = async () => {
  23.         const res = await axios.get("/api/all-user");
  24.         const users = res.data.users;
  25.  
  26.         setUsers(users);
  27.     };
  28.  
  29.     useEffect(() => {
  30.         getAllUser();
  31.     }, []);
  32.  
  33.     useEffect(() => {
  34.         const table = document.querySelector(".dataTable");
  35.         let isListenerAttached = false; // Flag to track listener attachment
  36.  
  37.         const handleButtonClick = (e) => {
  38.             if (e.target && e.target.classList.contains("view-btn")) {
  39.                 const id = e.target.getAttribute("data-id");
  40.                 console.log(`View button clicked for user ID: ${id}`);
  41.             }
  42.         };
  43.  
  44.         if (table && !isListenerAttached) {
  45.             table.addEventListener("click", handleButtonClick);
  46.             isListenerAttached = true; // Set the flag to true
  47.         }
  48.  
  49.         return () => {
  50.             if (table && isListenerAttached) {
  51.                 table.removeEventListener("click", handleButtonClick);
  52.                 isListenerAttached = false; // Reset the flag
  53.             }
  54.         };
  55.     }, [users]); // Only runs when users change
  56.  
  57.     return users ? (
  58.         <div className="table-responsive px-3">
  59.             <DataTable
  60.                 data={users}
  61.                 columns={columns}
  62.                 className="display table table-hover user-table"
  63.                 options={{ pageLength: 25 }}
  64.             >
  65.                 <thead className="table-primary">
  66.                     <tr>
  67.                         <th>Name</th>
  68.                         <th>Email</th>
  69.                         <th>Created</th>
  70.                         <th>Action</th>
  71.                     </tr>
  72.                 </thead>
  73.             </DataTable>
  74.         </div>
  75.     ) : (
  76.         <div className="d-flex align-items-center p-5">
  77.             <strong role="status">Loading...</strong>
  78.             <div className="spinner-border ms-auto" aria-hidden="true"></div>
  79.         </div>
  80.     );
  81. }
  82.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement