国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Facebook新一代React狀態管理庫Recoil

開發 前端
在 React Europe 2020 Conference 上, Facebook 軟件工程師 Dave McCabe 介紹了一個新的狀態管理庫 Recoil。

[[352149]]

 在 React Europe 2020 Conference 上, Facebook 軟件工程師 Dave McCabe 介紹了一個新的狀態管理庫 Recoil。

Recoil 現在還處于實驗階段,現在已經在 Facebook 一些內部產品中用于生產環境。畢竟是官方推出的狀態管理框架,之前沒時間仔細研究,借著國慶期間看了看,給大家分享一下。

State 和 Context 的問題

假設我們有下面一個場景:有 List 和 Canvas 兩個組件,List 中一個節點更新后,Canvas 中的節點也對應更新。

最常規則做法是將一個 state 通過父組件分發給 List 和 Canvas 兩個組件,顯然這樣的話每次 state 改變后 所有節點都會全量更新。

當然,我們還可以使用 Context API,我們將節點的狀態存在一個 Context 內,只要 Provider 中的 props 發生改變, Provider 的所有后代使用者都會重新渲染。

為了避免全量渲染的問題,我們可以把每個子節點存儲在單獨的 Context 中,這樣每多一個節點就要增加一層 Provider。

但是,如果子節點是動態增加的呢?我們還需要去動態增加 Provider ,這會讓整個樹再次重新渲染,顯然也是不符合預期的。

引入 Recoil

Recoil 本身就是為了解決 React 全局數據流管理的問題,采用分散管理原子狀態的設計模式。

Recoil 提出了一個新的狀態管理單位 Atom,它是可更新和可訂閱的,當一個 Atom 被更新時,每個被訂閱的組件都會用新的值來重新渲染。如果從多個組件中使用同一個 Atom ,所有這些組件都會共享它們的狀態。

你可以把 Atom 想象為為一組 state 的集合,改變一個 Atom 只會渲染特定的子組件,并不會讓整個父組件重新渲染。

用 Redux 或 Mobx 不可以嗎?

[[352154]]

因為 React 本身提供的 state 狀態在跨組件狀態共享上非常苦難,所以我們在開發時一般借助一些其他的庫如 Redux、Mobx 來幫助我們管理狀態。這些庫目前正被廣泛使用,我們也并沒有遇到什么大問題,那么 Facebook 為什么還要推出一款新的狀態管理框架呢?

使用 Redux、Mobx 當然可以,并沒有什么問題,主要原因是它們本身并不是 React 庫,我們是借助這些庫的能力來實現狀態管理。像 Redux 它本身雖然提供了強大的狀態管理能力,但是使用的成本非常高,你還需要編寫大量冗長的代碼,另外像異步處理或緩存計算也不是這些庫本身的能力,甚至需要借助其他的外部庫。

并且,它們并不能訪問 React 內部的調度程序,而 Recoil 在后臺使用 React 本身的狀態,在未來還能提供并發模式這樣的能力。

基礎使用

初始化

使用 recoil 狀態的組件需要使用 RecoilRoot 包裹起來: 

  1. import React from 'react';  
  2. import {  
  3.   RecoilRoot,  
  4.   atom,  
  5.   selector,  
  6.   useRecoilState,  
  7.   useRecoilValue,  
  8.   useSetRecoilState  
  9. } from 'recoil';  
  10. function App() {  
  11.   return (  
  12.     <RecoilRoot>  
  13.       <CharacterCounter />  
  14.     </RecoilRoot>  
  15.   );  

定義狀態

上面我們已經提到了 Atom 的概念, Atom 是一種新的狀態,但是和傳統的 state 不同,它可以被任何組件訂閱,當一個 Atom 被更新時,每個被訂閱的組件都會用新的值來重新渲染。

首先我們來定義一個 Atom: 

  1. export const nameState = atom({  
  2.   key: 'nameState',  
  3.   default: 'ConardLi'  
  4. }); 

這種方式意味著你不需要像 Redux 那樣集中定義狀態,可以像 Mobx 一樣將數據分散定義在任何地方。

要創建一個 Atom ,必須要提供一個 key ,其必須在 RecoilRoot 作用域中是唯一的,并且要提供一個默認值,默認值可以是一個靜態值、函數甚至可以是一個異步函數。

訂閱和更新狀態

Recoil 采用 Hooks 方式訂閱和更新狀態,常用的是下面三個 API:

  •  useRecoilState:類似 useState 的一個 Hook,可以取到 atom 的值以及 setter 函
  •  useSetRecoilState:只獲取 setter 函數,如果只使用了這個函數,狀態變化不會導致組件重新渲染
  •  useRecoilValue:只獲取狀態 
  1. import { nameState } from './store'  
  2. // useRecoilState  
  3. const NameInput = () => {  
  4.   const [name, setName] = useRecoilState(nameState);  
  5.   const onChange = (event) => {  
  6.    setName(event.target.value);  
  7.   }; 
  8.    return <>  
  9.    <input type="text" value={name} onChange={onChange} />  
  10.    <div>Name: {name}</div>  
  11.   </> 
  12.  
  13. // useRecoilValue  
  14. const SomeOtherComponentWithName = () => {  
  15.   const name = useRecoilValue(nameState);  
  16.   return <div>{name}</div> 
  17.  
  18. // useSetRecoilState    
  19. const SomeOtherComponentThatSetsName = () => {  
  20.   const setName = useSetRecoilState(nameState);  
  21.   return <button onClick={() => setName('Jon Doe')}>Set Name</button> 

派生狀態

selector 表示一段派生狀態,它使我們能夠建立依賴于其他 atom 的狀態。它有一個強制性的 get 函數,其作用與 redux 的 reselect 或 MobX 的 @computed 類似。 

  1. const lengthState = selector({  
  2.   key: 'lengthState',   
  3.   get: ({get}) => {  
  4.     const text = get(nameState);  
  5.     return text.length;  
  6.   },  
  7. });  
  8. function NameLength() {  
  9.   const length = useRecoilValue(charLengthState);  
  10.   return <>Name Length: {length}</> 

selector 是一個純函數:對于給定的一組輸入,它們應始終產生相同的結果(至少在應用程序的生命周期內)。這一點很重要,因為選擇器可能會執行一次或多次,可能會重新啟動并可能會被緩存。

異步狀態

Recoil 提供了通過數據流圖將狀態和派生狀態映射到 React 組件的方法。真正強大的功能是圖中的函數也可以是異步的。這使得我們可以在異步 React 組件渲染函數中輕松使用異步函數。使用 Recoil ,你可以在選擇器的數據流圖中無縫地混合同步和異步功能。只需從選擇器 get 回調中返回 Promise ,而不是返回值本身。

例如下面的例子,如果用戶名存儲在我們需要查詢的某個數據庫中,那么我們要做的就是返回一個 Promise 或使用一個 async 函數。如果 userID 發生更改,就會自動重新執行新查詢。結果會被緩存,所以查詢將僅對每個唯一輸入執行一次(所以一定要保證 selector 純函數的特性,否則緩存的結果將會和最新的值不一致)。 

  1. const userNameQuery = selector({  
  2.   key: 'userName',  
  3.   get: async ({get}) => {  
  4.     const response = await myDBQuery({  
  5.       userID: get(currentUserIDState),  
  6.     });  
  7.     return response.name;  
  8.   },  
  9. });  
  10. function CurrentUserInfo() {  
  11.   const userName = useRecoilValue(userNameQuery);  
  12.   return <div>{userName}</div> 

Recoil 推薦使用 Suspense,Suspense 將會捕獲所有異步狀態,另外配合 ErrorBoundary 來進行錯誤捕獲: 

  1. function MyApp() {  
  2.   return (  
  3.     <RecoilRoot>  
  4.       <ErrorBoundary>  
  5.         <React.Suspense fallback={<div>Loading...</div>}>  
  6.           <CurrentUserInfo />  
  7.         </React.Suspense>  
  8.       </ErrorBoundary>  
  9.     </RecoilRoot>  
  10.   );  

總結

Recoil 推崇的是分散式的狀態管理,這個模式很類似于 Mobx,使用起來也感覺有點像 observable + computed 的模式,但是其 API 以及核心思想設計的又沒有  Mobx 一樣簡潔易懂,反而有點復雜,對于新手上手起來會有一定成本。

在使用方式上完全擁抱了函數式的 Hooks 使用方式,并沒有提供 Componnent 的使用方式,目前使用原生的 Hooks API 我們也能實現狀態管理,我們也可以使用 useMemo 創造出派生狀態,Recoil 的 useRecoilState 以及 selector 也比較像是對 useContext、useMemo 的封裝。

但是畢竟是 Facebook 官方推出的狀態管理框架,其主打的是高性能以及可以利用 React 內部的調度機制,包括其承諾即將會支持的并發模式,這一點還是非常值得期待的。

另外,其本身的分散管理原子狀態的模式、讀寫分離、按需渲染、派生緩存等思想還是非常值得一學的。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2020-10-09 11:50:10

ReactRecoil前端

2025-06-30 10:05:31

2022-05-23 08:59:02

piniavue插件

2021-08-17 11:16:27

NVIDIA

2022-05-09 19:19:36

Pnpm管理工具

2013-01-04 16:15:08

微軟ERPDynamics AX

2022-03-10 16:01:29

Playwright開源

2012-07-02 10:36:19

菲亞特

2017-12-18 15:48:38

Facebook OpR

2016-01-26 11:58:12

2021-08-14 08:45:27

React開發應用程序

2010-05-05 18:05:00

新一代數據中心

2022-02-07 23:03:07

Python工具管理庫

2010-02-07 15:50:33

Android手機

2013-09-24 10:38:23

2009-10-13 10:04:51

醫院協同呼叫中心

2021-07-15 11:16:31

Spring WebWebFlux架構

2016-12-11 10:35:52

2025-03-17 10:38:30

2011-03-31 17:49:51

微軟嵌入式WindowsEmbe
點贊
收藏

51CTO技術棧公眾號

91av在线看| 中文字幕一区二区三区蜜月| 欧美一区二区视频在线观看2020 | 亚洲精品在线免费播放| 国产v亚洲v天堂无码久久久 | 狠狠爱www人成狠狠爱综合网 | 久久伊人一区二区| 四季av一区二区三区免费观看 | 蜜桃传媒九九九| 日本中文字幕一区二区有限公司| 高清欧美性猛交| 97天天综合网| 欧美在线观看视频一区二区三区 | 妞干网这里只有精品| 黄色亚洲精品| 日本一区二区在线播放| www.av片| 欧美亚视频在线中文字幕免费| 日韩国产一区三区| 欧美jizzhd欧美| 亚洲一区二区三区三| av小说在线| 欧美丝袜一区二区三区| 黄色直播在线| 婷婷亚洲久悠悠色悠在线播放| 污网站在线播放| 欧美老女人在线| 曰本人一级毛片免费完整视频| 久久精品国产99久久6| 日韩在线电影一区| 一区二区三区国产在线| 91系列在线观看| 一个色综合网| 91免费在线观看网站| 亚洲人成久久| 亚洲一区日本| 欧美日韩综合另类| 久久99国产精品免费| 永久免费看av| 久久久99免费| 亚洲另类第一页| 亚洲精品国产精华液| 在线观看av片| 中文字幕一区二区三区视频| 免费在线国产精品| 激情综合五月婷婷| 蜜桃传媒一区二区| 久久久久亚洲| 成人黄色片网站| 黄色日韩在线| 日本精品视频一区| 老司机精品视频导航| 伊人网在线免费| 国产精品久久久久影院| 免费成人黄色网址| 亚洲一区二区视频| 噜噜噜在线观看播放视频| 欧美一区二区三区四区久久| 国内不卡的一区二区三区中文字幕 | 一级女性全黄久久生活片免费| 老司机aⅴ毛片免费观看| 91精品国产一区二区人妖| 精品视频在线播放一区二区三区| 日本久久久久久久久| 亚洲欧美在线人成swag| 五月婷婷激情综合网| 一起操在线观看| 一本大道久久a久久精品综合| 97在线超碰| 好吊色欧美一区二区三区| 亚洲欧洲av另类| 新片速递亚洲合集欧美合集| 日韩高清成人| 91精品欧美综合在线观看最新| 免费免费啪视频在线观看| 欧美96一区二区免费视频| 97免费中文视频在线观看| 国产一区二区三区视频在线| 久久免费视频网站| 啪啪av大全导航福利综合导航| 欧美国产日韩一区二区三区| 久久久精品区| 久久久噜噜噜久久| 国产一区久久久| 不卡中文字幕在线| 欧美日韩亚洲一区二区三区在线| 欧美激情视频网站| 成人午夜sm精品久久久久久久| 精品噜噜噜噜久久久久久久久试看| 成视人a免费观看视频| 秋霞影院一区二区| 亚洲精品ww久久久久久p站| 91网址在线播放| 成人中文字幕av| 97成人超碰视| 免费午夜视频在线观看| 99re在线视频这里只有精品| 青少年xxxxx性开放hg| 91麻豆视频网站| 先锋成人影音| 在线看日韩精品电影| 免费大片黄在线观看视频网站| 午夜精品久久久久久不卡8050| 香蕉521av成人网| 精品久久久久久亚洲国产300| 十九岁完整版在线观看好看云免费| 亚洲男人的天堂av| 黄页网站在线观看| 亚洲国产中文字幕在线观看| 四虎地址8848精品| 在线观看国产精品91| 狠狠综合久久av一区二区蜜桃 | 91精品入口蜜桃| 国产亚洲婷婷免费| 欧洲综合视频| 91久久久精品| 国产a区久久久| 亚洲精品福利电影| 夜夜爽99久久国产综合精品女不卡| 午夜视频一区二区三区| 老司机成人影院| 综合一区中文字幕| 日韩欧美色综合| 久久黄色影院| 蜜桃视频在线观看www社区| 久久影院一区二区三区| 俄罗斯精品一区二区三区| 国产精品久久精品日日| 一级日本在线| 国产女主播一区二区| 天天亚洲美女在线视频| 视频精品一区二区| 91tv官网精品成人亚洲| 国产日产一区| 免费欧美视频| 香蕉久久a毛片| 色网站免费在线观看| 日本大片免费看| 久久久影视精品| 日韩成人在线免费观看| 亚洲午夜在线观看视频在线| 成人白浆超碰人人人人| 国产一区二区区别| 国精产品一区一区三区视频| 国产欧美一区二区三区米奇| 青青草在线视频免费观看| 亚洲精品视频一区二区三区| 精品少妇一区二区三区在线播放 | 日本午夜精品一区二区| 成人欧美在线观看 | 国产乱码精品一区二三赶尸艳谈| 成a人v在线播放| 自由色视频.| 男人天堂午夜在线| 日本电影一区二区在线观看| 成人福利免费网站| 日韩精品视频久久| www.夜夜爱| 9色视频在线观看| 国产又黄又爽免费视频| 国产精品极品美女在线观看免费| 777欧美精品| 一区二区在线观看av| 亚洲国产日日夜夜| 亚洲综合视频| 九九热hot精品视频在线播放| 免费成人美女女| jizz性欧美| 欧美黄色网络| 午夜日韩视频| 亚洲一区欧美激情| 91麻豆精品视频| 欧美性一级生活| 国产欧美日韩亚州综合| 日韩精品91| 国产一二三区在线视频| 污污的网站在线免费观看| 宅男在线一区| 国产精品视频| 亚洲成人自拍网| 久久亚洲影音av资源网| 久久久久久a亚洲欧洲aⅴ| 亚洲自拍偷拍区| 黄页网站大全在线观看| 永久www成人看片| 麻豆理论在线观看| 综合激情视频| 亚洲黄色性网站| 精品国产欧美一区二区| 亚洲性夜色噜噜噜7777| 欧美日韩国产专区| 国产精品社区| 窝窝社区一区二区| 不卡视频在线观看| 26uuu精品一区二区| 国产精品1区二区.| 免费高清视频精品| 亚洲美女91| 美女在线视频一区| 美女视频免费一区|