」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 停止使用 React-Query 中的 useQuery !

停止使用 React-Query 中的 useQuery !

發佈於2024-08-22
瀏覽:852

Stop using useQuery from React-Query !

在任何 Web 應用程式中,管理載入和錯誤狀態至關重要。顯示載入狀態可以讓使用者隨時了解情況,但從歷史上看,手動實施這種管理可能很乏味。

React Query 大幅簡化了載入狀態和全域狀態的處理。事實上,React Query 避免了冗餘請求,從而優化了應用程式的效能。

讓我們來看一個在應用程式中實作載入狀態的程式碼範例。

定義一個鉤子來取得使用者清單:

export const useUsers = () => {
  const { data, isLoading } = useQuery({
    queryKey: ["users"],
    queryFn: async () => {
      const response = await fetch("https://jsonplaceholder.typicode.com/users");
      await new Promise((resolve) => setTimeout(resolve, 2000));
      return response.json();
    },
  });

  return {
    users: data?.slice(0, 4) || [],
    isLoading,
  };
};

在這裡,我們使用 useQuery 來取得四個使用者。我們新增 2 秒的延遲來說明載入狀態。然後我們返回資料和載入狀態的布林值。

在元件方面,我們建立一個名為Example的元件:

const Example = (): JSX.Element => {
  const { users, isLoading } = useUsers();

  if (isLoading) {
    return 
Loading...
; } return (

Users

); };

在此元件中,我們使用鉤子來取得使用者清單。在渲染視圖之前,我們執行帶有載入訊息的“提前返回”,然後顯示標題、按鈕和使用者。

限制和替代方案

但是,每個網路呼叫都需要對載入狀態進行明確管理。如果程式碼未分解,視圖的某些元素可能正在等待顯示,例如標題和操作。

這是避免遮擋視圖的替代方法:

import "./App.css";
import UsersList from "./UsersList";
import { useUsers } from "./useUsers";

const Example = (): JSX.Element => {
  const { users, isLoading } = useUsers();

  return (
    

Users

{isLoading ?
Loading...
: }
); };

在這裡,我們使用條件渲染而不是「提前返回」。此解決方案可讀性較差,並且在複雜組件中更難維護。

理想的解決方案:通用載入元件

最巧妙的解決方案是建立一個元件來渲染我們的載入訊息或基於變數的主元件。

type Props = PropsWithChildren;

const LoadingWrapper = ({ children, isLoading }: Props): JSX.Element => {
  if (isLoading) {
    return 
Loading...
; } return {children}>; };

在我們的元件中的用法

const Example = (): JSX.Element => {
  const { users, isLoading } = useUsers();

  return (
    
...
); };

這種分解集中了條件渲染邏輯並統一了載入訊息的使用,提供了更清晰、更易於維護的程式碼。

探索懸念的魔力

但現在,如果我告訴你我們剛剛創建的這個元件已經內建到 React 中了。更好的是,它很神奇!不再需要手動管理 isLoading 狀態!

如何?

有了 React 的 Suspense(React 版本 >= 16.6),一切都變得更簡單、更清晰。 Suspense 允許您明確向 React 聲明元件正在等待非同步數據,React 會為我們管理一切。

實施 useSuspenseQuery

讓我們使用useSuspenseQuery來自動管理載入狀態。操作方法如下:

掛鉤獲取用戶

export const useUsersSuspense = () => {
  const { data } = useSuspenseQuery(
    ...
  );

  return {
    users: data?.slice(0, 4) || [],
    // Without the isLoading
  };
};

在有 Suspense 的組件中的使用

現在,讓我們更新範例元件以使用 Suspense:

const UsersComponent = (): JSX.Element => {
  const { users } = useUsersSuspense();

  return ;
};

const Example = (): JSX.Element => {
  return (
    

Users

Loading...
}> ); };

懸念的優點

透過 Suspense,我們將載入狀態的管理集中在一處,使程式碼更具可讀性和可維護性。只要資料不可用,Suspense 回退就會自動顯示,無需手動管理 isLoading 狀態。

此外,Suspense 鼓勵開發團隊分解他們的程式碼。透過使用標準化的載入元件和非同步狀態處理程序,開發人員可以創建可重複使用且一致的模組,從而長期提高程式碼品質和可維護性。

結論

使用 Suspense 和 useSuspenseQuery 徹底改變了 React 應用程式中載入狀態的管理。這種方法不僅簡化了程式碼,還透過確保平滑一致的渲染來增強使用者體驗。從 useQuery 過渡到 useSuspenseQuery 是更乾淨、更有效率的應用程式的自然演進。

此外,整合 Suspense 鼓勵開發團隊分解他們的程式碼。總而言之,採用 Suspense 和 useSuspenseQuery 不僅是技術上的改進,也是邁向更健康、更有效的開發實踐的一步。

我的電子報:D

版本聲明 本文轉載於:https://dev.to/rouretl/stop-using-usequery-from-react-query--1o9?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • React:了解 React 的事件系統
    React:了解 React 的事件系統
    Overview of React's Event System What is a Synthetic Event? Synthetic events are an event-handling mechanism designed by React to ach...
    程式設計 發佈於2024-11-05
  • 為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?
    為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?
    Multipart/Form-Data POSTsMultipart/Form-Data POSTs嘗試使用multipart/form-data POST 資料時,可能會出現類似所提供的錯誤訊息遭遇。理解問題需要檢視問題的構成。遇到的錯誤是 301 Moved Permanently 回應,表示資...
    程式設計 發佈於2024-11-05
  • 如何使用日期和時間物件來確定 PHP 中的時間邊界?
    如何使用日期和時間物件來確定 PHP 中的時間邊界?
    確定PHP 中的時間邊界在此編程場景中,我們的任務是確定給定時間是否在預先定義的範圍內。具體來說,我們得到三個時間字串:當前時間、日出和日落。我們的目標是確定當前時間是否位於日出和日落的邊界時間之間。 為了應對這個挑戰,我們將使用 DateTime 類別。這個類別使我們能夠表示和操作日期和時間。我們...
    程式設計 發佈於2024-11-05
  • 如何使用 CSS 變換比例修復 jQuery 拖曳/調整大小問題?
    如何使用 CSS 變換比例修復 jQuery 拖曳/調整大小問題?
    jQuery 使用CSS 轉換縮放拖曳/調整大小問題: 當應用CSS 轉換時,特別是變換:矩陣(0.5, 0, 0, 0.5, 0, 0);,對於一個div 並在子元素上使用jQuery 的draggable() 和resizing() 插件,jQuery 所做的更改變得與滑鼠位置「不同步”。 解決...
    程式設計 發佈於2024-11-05
  • 如何修復 TensorFlow 中的「ValueError:無法將 NumPy 陣列轉換為張量(不支援的物件類型浮點)」錯誤?
    如何修復 TensorFlow 中的「ValueError:無法將 NumPy 陣列轉換為張量(不支援的物件類型浮點)」錯誤?
    TensorFlow:解決「ValueError: Failed to Convert NumPy Array to Tensor (Unsupported Object Type Float)」工作時遇到的常見錯誤TensorFlow 的錯誤是「ValueError:無法將NumPy 陣列轉換為T...
    程式設計 發佈於2024-11-05
  • 如何有效率判斷本機儲存項目是否存在?
    如何有效率判斷本機儲存項目是否存在?
    確定本地儲存專案是否存在使用 Web 儲存時,在存取或修改特定專案之前驗證它們是否存在至關重要。在本例中,我們想要確定 localStorage 中是否設定了特定項目。 當前方法檢查項目是否存在的當前方法似乎是:if (!(localStorage.getItem("infiniteScr...
    程式設計 發佈於2024-11-05
  • Java 中的原子是什麼?了解 Java 中的原子性和線程安全
    Java 中的原子是什麼?了解 Java 中的原子性和線程安全
    1. Java 原子簡介 1.1 Java 中什麼是原子? 在Java中,java.util.concurrent.atomic套件提供了一組支援對單一變數進行無鎖定線程安全程式設計的類別。這些類別統稱為原子變數。最常使用的原子類別包括 AtomicInteger ...
    程式設計 發佈於2024-11-05
  • 前端/後端主要設定檔
    前端/後端主要設定檔
    從 DevOps 的角度來看,了解 Java 和 Node.js(後端和前端)程式碼庫中的設定檔對於管理建置流程、部署和環境設定至關重要。以下是在 Java 和 Node.js 應用程式中需要注意的設定檔的完整清單: Java 應用程式 後端 pom.xml (Maven): 管理依...
    程式設計 發佈於2024-11-05
  • Python 中出現「意外縮排」錯誤的原因以及如何解決?
    Python 中出現「意外縮排」錯誤的原因以及如何解決?
    Python 中意外縮排的意義是什麼? 在 Python 程式設計領域,精心製作的縮排起著至關重要的作用定義程式碼的結構和流程。當這個縮排不經意地被打亂時,就會出現「unexpected indent」錯誤,提示需要立即修正。 錯誤訊息背後:Unexpected Indent本質Python 的語法...
    程式設計 發佈於2024-11-05
  • 在 Node.js 中什麼時候應該使用 `setImmediate` 和 `process.nextTick`?
    在 Node.js 中什麼時候應該使用 `setImmediate` 和 `process.nextTick`?
    了解setImmediate 和nextTick 之間的差異了解setImmediate 和nextTick 之間的差異Node.js 版本0.10 引入了setImmediate,這是一個旨在補充process.nextjs 版本的新API。這兩個函數都提供了非同步執行回呼的方法,但它們具有控制其...
    程式設計 發佈於2024-11-05
  • jQuery中如何有效率地取得隱藏元素的高度?
    jQuery中如何有效率地取得隱藏元素的高度?
    在 jQuery 中獲取隱藏元素的高度處理隱藏元素時,檢索其高度可能具有挑戰性。暫時顯示元素以測量其高度然後再次隱藏它的傳統方法似乎效率低下。有沒有更優化的解決方案? jQuery 1.4.2 方法這是一個使用 jQuery 1.4.2 的範例:$select.show(); optionHeigh...
    程式設計 發佈於2024-11-05
  • 為什麼我不能在 Go Struct 標籤中使用變數?
    為什麼我不能在 Go Struct 標籤中使用變數?
    在Go 結構體標籤中使用變數在Go 中,結構體標籤用於指定有關結構體中字段的元數據。雖然可以使用字串文字定義標籤,但嘗試在其位置使用變數會導致錯誤。 無效用法:const ( TYPE = "type" ) type Shape struct { Type str...
    程式設計 發佈於2024-11-05
  • Qopy:身為開發人員我最喜歡的剪貼簿管理器
    Qopy:身為開發人員我最喜歡的剪貼簿管理器
    身為開發人員,我一直在尋找可以讓我的工作流程更順暢、更有效率的工具。最近,我偶然發現了 Qopy,一個可以在 Linux 和 Windows 上運行的開源剪貼簿管理器。 什麼是Qopy? Qopy 是一個簡單的剪貼簿管理器,旨在改善標準剪貼簿體驗。它的設計宗旨是用戶友好、可靠且快速...
    程式設計 發佈於2024-11-05
  • 為什麼我的按鈕上的懸停效果不起作用?
    為什麼我的按鈕上的懸停效果不起作用?
    更改懸停時的按鈕顏色:替代解決方案嘗試更改懸停時按鈕的顏色時,如果出現以下情況,可能會令人沮喪該解決方案未能產生預期的效果。考慮提供的範例程式碼:a.button { ... } a.button a:hover{ background: #383; }此解決方案嘗試在連結懸停在「按...
    程式設計 發佈於2024-11-05
  • 僅使用 Python 建構前端
    僅使用 Python 建構前端
    對於專注於後端的開發人員來說,前端開發可能是一項艱鉅的、甚至是噩夢般的任務。在我職業生涯的早期,前端和後端之間的界線是模糊的,每個人都被期望能夠處理這兩者。 CSS,尤其是,是一場持續不斷的鬥爭;這感覺像是一個不可能的任務。 雖然我喜歡前端工作,但 CSS 對我來說仍然是一個複雜的挑戰,特別是因為...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3