成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用React-query解決你一半的狀態(tài)管理問題

開發(fā) 前端
React-Query是一個基于hooks的數(shù)據(jù)請求庫。React-Query中的Query指一個異步請求的數(shù)據(jù)源。通過使用React-Query(或SWR)這樣的數(shù)據(jù)請求庫,可以將服務(wù)端狀態(tài)從全局狀態(tài)中解放出來。

[[382128]]

 按照來源,前端有兩類「狀態(tài)」需要管理:

  • 用戶交互的中間狀態(tài)
  • 服務(wù)端狀態(tài)

在陳年的老項目中,通常用Redux、Mobx這樣的「全局狀態(tài)管理方案」無差別對待他們。

事實上,他們有很大區(qū)別:

用戶交互的中間狀態(tài)

比如組件的isLoading、isOpen,這類「狀態(tài)」的特點是:

  • 以「同步」的形式更新
  • 狀態(tài)」完全由前端控制
  • 狀態(tài)」比較獨立(不同的組件擁有各自的isLoading)

這類「狀態(tài)」通常保存在組件內(nèi)部。

當(dāng)「狀態(tài)」需要跨組件層級傳遞,通常使用Context API。

再大范圍的「狀態(tài)」會使用Redux這樣的「全局狀態(tài)管理方案」。

服務(wù)端狀態(tài)

當(dāng)我們從服務(wù)端請求數(shù)據(jù):

  1. function App() { 
  2.   const [data, updateData] = useState(null); 
  3.    
  4.   useEffect(async () => { 
  5.     const data = await axios.get('/api/user'); 
  6.     updateData(data); 
  7.   }, []) 
  8.  
  9.   // 處理data 

返回的數(shù)據(jù)通常作為「狀態(tài)」保存在組件內(nèi)部(如App組件的data狀態(tài))。

如果是需要復(fù)用的通用「狀態(tài)」,通常將其保存在Redux這樣的「全局狀態(tài)管理方案」中。

這樣做有2個壞處:

1.需要重復(fù)處理請求中間狀態(tài)

為了讓App組件健壯,我們還需要處理請求中、出錯等中間狀態(tài):

  1. function App() { 
  2.   const [data, updateData] = useState(null); 
  3.   const [isError, setError] = useState(false); 
  4.   const [isLoading, setLoading] = useState(false); 
  5.    
  6.   useEffect(async () => { 
  7.     setError(false); 
  8.     setLoading(true); 
  9.     try { 
  10.       const data = await axios.get('/api/user'); 
  11.       updateData(data); 
  12.     } catch(e) { 
  13.       setError(true); 
  14.     } 
  15.     setLoading(false); 
  16.   }, []) 
  17.  
  18.   // 處理data 

這類通用的中間狀態(tài)處理邏輯可能在不同組件中重復(fù)寫很多次。

2.「緩存」的性質(zhì)不同于「狀態(tài)

不同于交互的中間狀態(tài),服務(wù)端狀態(tài)更應(yīng)被歸類為「緩存」,他有如下性質(zhì):

  • 通常以「異步」的形式請求、更新
  • 狀態(tài)」由請求的數(shù)據(jù)源控制,不由前端控制
  • 狀態(tài)」可以由不同組件共享

作為可以由不同組件共享的「緩存」,還需要考慮更多問題,比如:

  • 緩存失效
  • 緩存更新

Redux一把梭固然方便。但是,區(qū)別對待不同類型「狀態(tài)」能讓項目更可控。

這里,推薦使用React-Query管理服務(wù)端狀態(tài)。

[[382129]]

另一個可選方案是SWR[1]。你可以從這里[2]看到他們的區(qū)別

初識React-Query

React-Query是一個基于hooks的數(shù)據(jù)請求庫。

我們可以將剛才的例子用React-Query改寫:

  1. import { useQuery } from 'react-query' 
  2.  
  3. function App() { 
  4.   const {data, isLoading, isError} = useQuery('userData', () => axios.get('/api/user')); 
  5.    
  6.   if (isLoading) { 
  7.     return <div>loading</div>; 
  8.   } 
  9.    
  10.   return ( 
  11.     <ul> 
  12.       {data.map(user => <li key={user.id}>{user.name}</li>)} 
  13.     </ul> 
  14.   ) 

 React-Query中的Query指一個異步請求的數(shù)據(jù)源。

例子中userData字符串就是這個query獨一無二的key。

可以看到,React-Query封裝了完整的請求中間狀態(tài)(isLoading、isError...)。

不僅如此,React-Query還為我們做了如下工作:

  • 多個組件請求同一個query時只發(fā)出一個請求
  • 緩存數(shù)據(jù)失效/更新策略(判斷緩存合適失效,失效后自動請求數(shù)據(jù))
  • 對失效數(shù)據(jù)垃圾清理

數(shù)據(jù)的CRUD由2個hook處理:

  • useQuery處理數(shù)據(jù)的查
  • useMutation處理數(shù)據(jù)的增/刪/改

在下面的例子中,點擊「創(chuàng)建用戶」按鈕會發(fā)起創(chuàng)建用戶的post請求:

  1. import { useQuery, queryCache } from 'react-query'
  2.  
  3. unction App() { 
  4.  const {data, isLoading, isError} = useQuery('userData', () => axios.get('/api/user')); 
  5.  // 新增用戶 
  6.  const {mutate} = useMutation(data => axios.post('/api/user', data)); 
  7.  
  8.  return ( 
  9.    <ul> 
  10.      {data.map(user => <li key={user.id}>{user.name}</li>)} 
  11.      <button 
  12.        onClick={() => { 
  13.          mutate({name'kasong', age: 99}) 
  14.        }} 
  15.      > 
  16.        創(chuàng)建用戶 
  17.      </button> 
  18.    </ul> 
  19.  ) 

 但是點擊后userData query對應(yīng)數(shù)據(jù)不會更新,因為他還未失效。

所以我們需要告訴React-Query,userData query對應(yīng)的緩存已經(jīng)失效,需要更新:

  1. import { useQuery, queryCache } from 'react-query'
  2.  
  3. function App() { 
  4.   // ... 
  5.   const {mutate} = useMutation(userData => axios.post('/api/user', userData), { 
  6.     onSuccess: () => { 
  7.       queryCache.invalidateQueries('userData'
  8.     }   
  9.   }) 
  10.    
  11.   // ... 

通過調(diào)用mutate方法,會觸發(fā)請求。

當(dāng)請求成功后,會觸發(fā)onSuccess回調(diào),回調(diào)中調(diào)用queryCache.invalidateQueries,將userData對應(yīng)的query緩存置為invalidate。

這樣,React-Query就會重新請求userData對應(yīng)query的數(shù)據(jù)。

總結(jié)

通過使用React-Query(或SWR)這樣的數(shù)據(jù)請求庫,可以將服務(wù)端狀態(tài)從全局狀態(tài)中解放出來。

這為我們帶來很多好處:

  • 使用通用的hook處理請求中間狀態(tài)
  • 多余請求合并
  • 針對緩存的更新/失效策略
  • Redux等「全局狀態(tài)管理方案」可以更專注于「前端中間狀態(tài)」處理

參考資料

[1]SWR: https://swr.vercel.app/

[2]這里: https://react-query.tanstack.com/comparison

 【編輯推薦】

 

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2023-05-26 06:30:56

2015-07-27 10:24:01

蘋果中國

2013-02-25 10:11:35

4GLTE商用網(wǎng)絡(luò)

2020-12-04 10:11:26

Unsafejava并發(fā)包

2024-04-17 07:59:26

React狀態(tài)管理屬性鉆取

2015-11-24 10:04:59

大數(shù)據(jù)公司排行

2013-11-27 15:48:56

移動中間件廠商

2018-06-03 08:49:21

2014-11-18 10:02:28

2020-10-13 17:30:45

Python代碼內(nèi)存

2015-06-16 10:50:44

2017-02-24 13:53:38

HTTPS流量互聯(lián)網(wǎng)

2021-12-09 08:54:20

數(shù)組數(shù)字排序

2017-02-27 16:54:20

HTTPS網(wǎng)絡(luò)流量互聯(lián)網(wǎng)

2016-12-16 13:07:30

云存儲運營混合云

2010-09-17 16:21:33

系統(tǒng)升級

2020-07-13 09:48:58

云計算云安全數(shù)據(jù)

2019-10-10 10:54:16

戴爾

2022-08-27 14:45:52

人工智能自動化IT

2024-06-11 09:02:30

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品福利久久久 | 国产一级片久久久 | 久久久精彩视频 | a在线观看 | 韩日av在线 | 国产乱xxav | 日一区二区三区 | 黄页网址在线观看 | 亚洲国产高清高潮精品美女 | 伊人精品在线视频 | 久久国产精品-国产精品 | 午夜天堂精品久久久久 | 欧美 日韩 国产 成人 | 国产一区二区三区四区 | 看片天堂 | 亚洲一区二区三区免费 | 午夜视频大全 | 国产一级黄色网 | 亚洲精品在线免费观看视频 | 午夜看看 | av免费网站在线观看 | 久久久久久久一区二区三区 | 夜夜夜夜草 | 日韩一区二区免费视频 | h视频在线免费 | 国产精品美女www | 国产国产精品久久久久 | 91国内外精品自在线播放 | 日日天天| 在线播放一区二区三区 | 国产视频一区二区 | 成人免费视频观看 | 狠狠操av | 麻豆久久久久久久久久 | 成人在线精品视频 | 精品国产乱码久久久久久丨区2区 | 久久久久久久网 | 欧美精品一区二区三区四区五区 | 久久青青| 99精品视频在线观看 | 精品中文在线 |