首頁 > web前端 > js教程 > 修復討厭的錯誤(理解模態) - 第 1 部分

修復討厭的錯誤(理解模態) - 第 1 部分

Susan Sarandon
發布: 2025-01-17 08:29:08
原創
335 人瀏覽過

調試 Next.js 專案中煩人的錯誤

上週的某個時候,我開始開發一個新項目,主要使用 Next.js 構建,並使用 Shadcn 元件庫進行樣式設計。在建置過程中,我遇到了一個特別煩人的錯誤,它不僅減慢了我的速度,還促使我重新考慮調試和理解我使用的工具的方法。

為什麼要寫這篇?

寫這篇文章的目的是迫使自己更深入地了解組件和框架的內部運作原理。過去,我寫的程式碼運作良好,但沒有時間深入理解我所寫的內容。這一次,我想採用一種系統化的方法來迫使我學習事物的內部運作方式,並且沒有什麼可以強迫你在編碼遇到錯誤時放慢速度。寫下它將幫助我反思、學習和分享我的旅程。

系統的調試方法

為了解決這個問題,我將偵錯過程分為三個系統步驟:

  1. 複製 Bug: 返回到發生問題的特定提交,檢查程式碼,並可靠地重現錯誤。
  2. 了解錯誤發生的原因:分析導致問題的根本原因以及組件之間的交互作用。
  3. 修正錯誤:實作解決方案並驗證它。

本文將詳細介紹第一步。


複製錯誤

這是給我帶來很多麻煩的有問題的組件:

程式碼片段:OrganizationDetailsModal

"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>
登入後複製

這些組件的作用

  1. 下拉式選單:按一下時,此元件會顯示操作的下拉清單。

Image description

  1. 對話方塊元件: 此模式對話方塊是透過從下拉清單中選擇一個動作來觸發的。它顯示詳細資訊並有一個關閉按鈕可以將其關閉。

Image description

點擊下拉式選單時,它會如預期開啟。在下拉清單中,有一個用於查看詳細資訊的選項,這會觸發對話方塊元件的出現。當對話方塊關閉時就會出現問題 - 此後頁面上的其他內容都無法按一下。這很令人困惑,因為這兩個組件似乎可以完美地單獨工作。


挫折

儘管花了幾個小時進行調查,但我無法找出問題的原因。下拉式選單和對話方塊元件之間的互動似乎會造成某種狀態不一致或 DOM 問題。

最終,我選擇完全更換其中一個組件,暫時解決了問題。然而,在沒有了解根本原因的情況下,我感到不滿意,這就是我打算進一步探索的原因。

結論

我的調試之旅的第一部分到此結束——複製錯誤並記錄問題。在下一部分中,我將深入研究這些組件的內部工作原理,以了解可能導致這種異常行為的原因。透過這樣做,我希望獲得一些見解,這將有助於我將來修復類似的錯誤並成長為開發人員。

請關注第 2 部分:了解錯誤發生的原因。

以上是修復討厭的錯誤(理解模態) - 第 1 部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板