Rumah > Soal Jawab > teks badan
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 (kg) </TableSortLabel></TableCell> <TableCell align="center" onClick={handleSortRequest("price")}> <TableSortLabel active={true} direction={orderDirection}> Price ($) </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粉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.