Heim >Web-Frontend >js-Tutorial >Böse Fehler beheben (Modalitäten verstehen) – Teil 1
Irgendwann letzte Woche begann ich mit der Arbeit an einem neuen Projekt, das hauptsächlich mit Next.js erstellt und mithilfe der Shadcn-Komponentenbibliothek gestaltet wurde. Beim Erstellen bin ich auf einen besonders ärgerlichen Fehler gestoßen, der mich nicht nur verlangsamte, sondern mich auch dazu veranlasste, meinen Ansatz zum Debuggen und zum Verständnis der Tools, mit denen ich arbeite, zu überdenken.
Der Zweck des Schreibens dieses Artikels besteht darin, mich dazu zu zwingen, tiefer in das Verständnis des Innenlebens von Komponenten und Frameworks einzutauchen. In der Vergangenheit habe ich Code geschrieben, der gut funktionierte, aber ich hatte nicht die Zeit, das Geschriebene gründlich zu verstehen. Dieses Mal möchte ich einen systematischen Ansatz verfolgen, der mich dazu zwingt, das Innenleben der Dinge zu erlernen, und nichts zwingt Sie dazu, langsamer zu programmieren, wenn ein Fehler auftritt. Darüber zu schreiben wird mir helfen, über meine Reise nachzudenken, zu lernen und sie zu teilen.
Um dieses Problem zu beheben, habe ich den Debugging-Prozess in drei systematische Schritte unterteilt:
In diesem Artikel wird der erste Schritt im Detail behandelt.
Hier ist die problematische Komponente, die mir so viel Ärger bereitet hat:
"use client"; import { motion } from "framer-motion"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogClose, DialogFooter } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import Image from "next/image"; import { useState } from "react"; const OrganizationDetailsModal: React.FC<OrganizationDetailsModalProps> = ({ hideModal, organization }) => { const [open, setOpen] = useState(true); const handleClose = () => { hideModal(); setOpen(false); }; return ( <Dialog open={open} onOpenChange={(isOpen) => { if (!isOpen) { handleClose(); } }} > <DialogContent onCloseAutoFocus={(e) => { e.preventDefault(); const safeElement = document.getElementById("safe-focus-element"); if (safeElement) safeElement.focus(); }} className="flex max-h-[80vh] w-[400px] flex-col rounded-xl bg-white px-5 py-4 overflow-y-auto" > <DialogHeader> <div className="flex justify-between items-center"> <DialogTitle>Organisation Details</DialogTitle> <DialogClose asChild> <button onClick={handleClose} className="text-gray-700 hover:text-gray-900">X</button> </DialogClose> </div> </DialogHeader> <div className="space-y-4"> <div className="flex justify-between"> <span className="text-sm font-semibold">Organization Name</span> <span className="text-sm">{organization.organizationName}</span> </div> </div> <DialogFooter> <button onClick={handleClose} className="bg-primary-green text-white px-4 py-2 rounded-md"> Back </button> </DialogFooter> </DialogContent> </Dialog> ); }; export default OrganizationDetailsModal;
<DropdownMenu> <DropdownMenuTrigger className="focus:outline-none"> <MoreHorizontal className="h-5 w-5 cursor-pointer" /> </DropdownMenuTrigger> <DropdownMenuContent align="start" sideOffset={4} className="rounded-md p-1 shadow-md"> {rowMenuItems.map((menuItem, menuIndex) => ( <DropdownMenuItem key={menuIndex} onClick={() => menuItem.onClick(row)} className="flex justify-start gap-2 px-3 py-2 hover:bg-gray-100" > {menuItem.icon && <Image src={menuItem.icon} alt={menuItem.label} />} <span>{menuItem.label}</span> </DropdownMenuItem> ))} </DropdownMenuContent> </DropdownMenu>
Wenn auf das Dropdown-Menü geklickt wird, wird es wie erwartet geöffnet. Im Dropdown-Menü gibt es eine Option zum Anzeigen von Details, wodurch die Dialogkomponente angezeigt wird. Das Problem tritt auf, wenn das Dialogfeld geschlossen wird – danach ist nichts anderes auf der Seite anklickbar. Das war verwirrend, da beide Komponenten isoliert perfekt zu funktionieren schienen.
Obwohl ich mehrere Stunden mit der Untersuchung verbracht habe, konnte ich die Ursache des Problems nicht genau bestimmen. Die Interaktion zwischen den Dropdown- und Dialogkomponenten schien zu einer Art Statusinkonsistenz oder einem DOM-Problem zu führen.
Schließlich entschied ich mich dafür, eine der Komponenten vollständig auszutauschen, wodurch das Problem vorübergehend behoben wurde. Ich war jedoch unzufrieden, ohne die Grundursache zu verstehen, die ich weiter erforschen möchte.
Damit ist der erste Teil meiner Debugging-Reise abgeschlossen – das Reproduzieren des Fehlers und das Dokumentieren des Problems. Im nächsten Teil werde ich tiefer in das Innenleben dieser Komponenten eintauchen, um zu verstehen, was dieses ungewöhnliche Verhalten verursacht haben könnte. Dadurch hoffe ich, Erkenntnisse zu gewinnen, die mir helfen, ähnliche Fehler in Zukunft zu beheben und mich als Entwickler weiterzuentwickeln.
Bleiben Sie dran für Teil 2: Verstehen, warum der Fehler auftritt.
Das obige ist der detaillierte Inhalt vonBöse Fehler beheben (Modalitäten verstehen) – Teil 1. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!