Rumah  >  Soal Jawab  >  teks badan

Mengapa saya mendapat "Terlalu banyak pemaparan semula. Reaksi mengehadkan bilangan pemaparan"? di mana gelung tak terhingga saya

Kod saya di bawah berjalan tetapi saya mendapat ralat "terlalu banyak pemaparan semula". Saya tidak tahu mengapa. Jika saya mengeluarkan suis dwi dan meletakkannya pada satu unit (seperti harga) maka ia berfungsi. Walau bagaimanapun, saya tidak dapat mencari di mana kod saya menyebabkan gelung tak terhingga. Internet mengatakan saya mungkin menggunakan useState dengan salah. Sebarang bantuan amat dihargai. Saya seorang pemula, jadi sila faham bahawa saya mungkin telah melakukan sesuatu yang bodoh! Walau apa pun, pembelajaran itu hebat! Terima kasih.

import React from "react";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import Paper from "@mui/material/Paper";
import TableSortLabel from "@mui/material/TableSortLabel";
import { useState } from "react";


function createData(number, item, qty, price) {
  return { number, item, qty, price };
}

const rows = [
  createData(1, "Apple", 5, 3),
  createData(2, "Orange", 2, 2),
  createData(3, "Grapes", 3, 1),
  createData(4, "Tomato", 2, 1.6),
  createData(5, "Mango", 1.5, 4)
];

export default function SortedTable() {
  const [rowData, setRowData] = useState(rows);
  const [orderDirection, setOrderDirection] = useState("asc");
  const [orderUnit, setOrderUnit] = useState("number");

  const sortArray = (arr, orderBy, orderUn) => {
    switch (orderUn) {
      case "number": 
      default:
        switch (orderBy) {
          case "asc":
          default:
            return arr.sort((a, b) =>
              a.number > b.number ? 1 : b.number > a.number ? -1 : 0
            );
          case "desc":
            return arr.sort((a, b) =>
              a.number > b.number ? 1 : b.number > a.number ? -1 : 0
            );
        }
      case "item": 
      switch (orderBy) {
        case "asc":
        default:
          return arr.sort((a, b) =>
            a.item > b.item ? 1 : b.item > a.item ? -1 : 0
          );
        case "desc":
          return arr.sort((a, b) =>
            a.item < b.item ? 1 : b.item < a.item ? -1 : 0
          );
      }
      case "qty": 
      switch (orderBy) {
        case "asc":
        default:
          return arr.sort((a, b) =>
            a.qty > b.qty ? 1 : b.qty > a.qty ? -1 : 0
          );
        case "desc":
          return arr.sort((a, b) =>
            a.qty < b.qty ? 1 : b.qty < a.qty ? -1 : 0
          );
      }
      case "price": 
      switch (orderBy) {
        case "asc":
        default:
          return arr.sort((a, b) =>
            a.price > b.price ? 1 : b.price > a.price ? -1 : 0
          );
        case "desc":
          return arr.sort((a, b) =>
            a.price < b.price ? 1 : b.price < a.price ? -1 : 0
          );
      }
    }
  };
 


  const handleSortRequest = (unit) => {
    setOrderUnit(orderUnit === unit); 
    setRowData(sortArray(rows, orderDirection, orderUnit));
    setOrderDirection(orderDirection === "asc" ? "desc" : "asc");
  };

  return (
    <TableContainer component={Paper}>
      <Table aria-label="simple table" >
        <TableHead>
          <TableRow>
            <TableCell align="center" onClick={handleSortRequest("number")}><TableSortLabel active={true} direction={orderDirection}>
              S.No
            </TableSortLabel></TableCell>

            <TableCell align="center" onClick={handleSortRequest("item")}><TableSortLabel active={true} direction={orderDirection}>
              Item
            </TableSortLabel></TableCell>

            <TableCell align="center" onClick={handleSortRequest("qty")}><TableSortLabel active={true} direction={orderDirection}>
              Quantity&nbsp;(kg)
            </TableSortLabel></TableCell>

            <TableCell align="center" onClick={handleSortRequest("price")}>
              <TableSortLabel active={true} direction={orderDirection}>
                Price&nbsp;($)
              </TableSortLabel>
            </TableCell>
          </TableRow>
        </TableHead>
        <TableBody>
          {rowData.map((row) => (
            <TableRow key={row.number}>
              <TableCell width="100" component="td" scope="row" align="center">
                {row.number}
              </TableCell>
              <TableCell align="center">{row.item}</TableCell>
              <TableCell align="center">{row.qty}</TableCell>
              <TableCell align="center">{row.price}</TableCell>
            </TableRow>
          ))}
        </TableBody>
      </Table>
    </TableContainer>
  );
}

Saya cuba menjadikan setiap lajur boleh diisih berdasarkan lajur yang diklik. Soalan bonus, mengapa pengepala saya tidak sepadan dengan lajur di bawah apabila dipaparkan.

P粉946437474P粉946437474424 hari yang lalu498

membalas semua(1)saya akan balas

  • P粉801904089

    P粉8019040892023-09-15 11:54:02

    Anda perlu lulus rujukan fungsi dan bukannya memanggil fungsi secara terus. Dengan cara ini, fungsi hanya akan dipanggil apabila peristiwa berlaku, bukan serta-merta apabila komponen itu dipaparkan.

    onClick={() => handleSortRequest("item")}

    Saya juga memfaktorkan semula fungsi sortArray anda untuk menjadikannya boleh dibaca. Jika ia salah. Tolong jangan ganggu. :D

    const sortArray = useCallback((arr, orderBy, orderUn) => {
        const compare = (a, b, prop, order) => {
          if (order === "asc") {
            return a[prop] > b[prop] ? 1 : b[prop] > a[prop] ? -1 : 0;
          } else {
            return a[prop] < b[prop] ? 1 : b[prop] < a[prop] ? -1 : 0;
          }
        };
    
        switch (orderUn) {
          case "number":
          default:
            return arr.sort((a, b) => compare(a, b, "number", orderBy));
    
          case "item":
            return arr.sort((a, b) => compare(a, b, "item", orderBy));
    
          case "qty":
            return arr.sort((a, b) => compare(a, b, "qty", orderBy));
    
          case "price":
            return arr.sort((a, b) => compare(a, b, "price", orderBy));
        }
      }, []);

    Gunakan useCallback untuk mengelakkan pemaparan semula yang tidak perlu apabila kebergantungan tidak berubah

    const handleSortRequest = useCallback(
        (unit) => {
          setOrderUnit(orderUnit === unit);
          setRowData(sortArray(rows, orderDirection, orderUnit));
          setOrderDirection(orderDirection === "asc" ? "desc" : "asc");
        },
        [orderDirection, orderUnit, sortArray]
      );

    Semoga ini dapat membantu anda.

    balas
    0
  • Batalbalas