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

Zustand 使用優化:關于自動生成選擇器

開發 開發工具
本文我們講解了在使用 Zustand 時的一個小優化,關于自動生成選擇器。借助 createSelectors(),我們可以更加輕松、快捷的訪問 Store 中的狀態或是 Action。

Zustand[1] 是目前 React 生態里比較受歡迎的一個狀態庫,主要是因為用法上的簡潔。

Zustand 簡單使用

首先安裝 zustand:

# NPM
npm install zustand
# Or, use any package manager of your choice.

接著從 zustand 庫中引入 create API 就能創建同時包含狀態和用于修改狀態的方法的 Store 對象了。

import { create } from 'zustand'

const useBearStore = create((set) => ({
  bears: 0,
  increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
  removeAllBears: () => set({ bears: 0 }),
  updateBears: (newBears) => set({ bears: newBears }),
}))

這里,create() 接受一個回調函數用于定義初始 Store 中包含的內容:

  • bears 是狀態
  • increasePopulation()、removeAllBears()、updateBears() 則是用于修改 bears 這個狀態的方法,又叫 Action

同時,create() 返回的 useStore() 是一個 React Hook。useBearStore() 接收的是一個用于從 Store 中提取內容的回調函數,又叫“選擇器(Selector)”。

接下來,就可以在你的組件中使用 useBearStore() 了。

你可以引入狀態:

function BearCounter() {
  const bears = useBearStore((state) => state.bears)
  return <h1>{bears} around here...</h1>
}

圖片圖片

也可以引入用于修改狀態的方法:

function Controls() {
  const increasePopulation = useBearStore((state) => state.increasePopulation)
  return <button onClick={increasePopulation}>one up</button>
}

如此一來,你在 <Controls /> 中調用修改 increasePopulation() 后,會觸發 state.bears 的值加 1,接著就能在 <BearCounter /> 中看到新的值了。

圖片圖片

掌握了以上關于 Zustand 的基本用法后,其實你就可以開發項目了。

不過,你想更進一步提升開發體驗,那么就要去解決這個過程當中的一些使用痛點。

其中一個是關于更新嵌套狀態的,這在之前的文章《React 狀態庫 Zustand 入門教程》[2] 中有提到,有興趣的讀者可以移步閱讀。

不過,我們本次關注的是另一個痛點:就是從 Store 中獲取狀態/Action的過程。

自動生成選擇器

按照之前的介紹,在創建完 Store 之后,我們每次都要在組件中這樣去使用:

const bears = useBearStore((state) => state.bears)

我們要使用這種方式從 Store 中提取狀態或是 Action。

不過每次頻繁這樣去寫這樣一個選擇器函數是很乏味的,這個時候我們就可以考慮借助一個工具函數,對我們的 Store 進行增強,支持狀態/Action的快捷訪問。

這就是我們要介紹的 createSelectors(store) 函數了——先亮代碼:

const createSelectors = (store) => {
  store.use = {}
  for (let k of Object.keys(store.getState())) {
    store.use[k] = () => store((s) => s[k])
  }
  return store
}

代碼量并不多,也好理解。

createSelectors() 接收的 store 就是前一節的 useBearStore,也就是 create() 的返回值。

createSelectors() 的作用很簡單,就是向 store 中添加一個 .use 屬性,用于快捷訪問其上的內容。

當然,這里有一個隱藏的點,就是可以通過 store.getState() 拿到當前 Store 的所有內容。

圖片圖片

接著,修改之前的內容——為了便于區分,我們將原來的 useBearStore 該名稱 useBearStoreBase 了。經 createSelectors() 處理后,返回的是 useBearStore。

- const useBearStore = create((set) => ({
+ const useBearStoreBase = create((set) => ({
  // ...
}))

+ const useBearStore = createSelectors(useBearStoreBase)

現在,修改組件中使用 useBearStore 的地方。

function BearCounter() {
-  const bears = useBearStore((state) => state.bears)
+  const bears = useBearStore.use.bears()
  return <h1>{bears} around here...</h1>
}
function Controls() {
-  const increasePopulation = useBearStore((state) => state.increasePopulation)
+  const increasePopulation = useBearStore.use.increasePopulation()
  return <button notallow={increasePopulation}>one up</button>
}

減少了一些代碼量,但是積少成多,也會提升一些開發體驗。

圖片圖片

不過需要注意的是,每次使用 .use 獲取不管是狀態還是 Acton 時,都要帶上 () 的調用后綴。

// 不管是狀態還是 Action,后面都要帶上 `()`
const bears = useBearStore.use.bears()
const increasePopulation = useBearStore.use.increasePopulation()

當然,現在項目中大都使用 TypeScript,為了獲得更好的類型提示,我們對 createSelectors() 進行改造,添加類型注解。

import { StoreApi, UseBoundStore } from 'zustand'

type WithSelectors<S> = S extends { getState: () => infer T }
  ? S & { use: { [K in keyof T]: () => T[K] } }
  : never

const createSelectors = <S extends UseBoundStore<StoreApi<object>>>(
  _store: S,
) => {
  let store = _store as WithSelectors<typeof _store>
  store.use = {}
  for (let k of Object.keys(store.getState())) {
    ;(store.use as any)[k] = () => store((s) => s[k as keyof typeof s])
  }

  return store
}

這也是官方給出的方案[3],如果你對 TypeScript 不夠熟悉也沒關系,直接將上述代碼貼到項目中使用即可。

總結

本文我們講解了在使用 Zustand 時的一個小優化,關于自動生成選擇器。借助 createSelectors(),我們可以更加輕松、快捷的訪問 Store 中的狀態或是 Action。

好了,希望本文的內容對你的工作有所幫助。感謝閱讀,再見。

參考資料

[1]Zustand: https://docs.pmnd.rs/zustand

[2]《React 狀態庫 Zustand 入門教程》: https://juejin.cn/post/7388064351504056335#heading-4

[3]官方給出的方案: https://docs.pmnd.rs/zustand/guides/auto-generating-selectors#create-the-following-function:-createselectors

責任編輯:武曉燕 來源: 寫代碼的寶哥
相關推薦

2010-09-03 09:30:29

CSS選擇器

2012-04-16 14:32:31

iOS選擇器代碼

2024-05-07 13:29:00

CSS選擇器權重

2021-10-10 19:28:00

Go對象選擇器

2012-12-27 14:08:39

Android開發顏色選擇器

2011-11-28 13:42:55

Sencha Touc組件選擇器

2024-04-30 10:59:03

WebSocketCSS選擇器

2017-03-20 14:46:07

Android日期時間選擇器

2023-11-03 11:57:04

2013-03-11 10:30:56

CSSWeb

2023-03-16 10:20:55

CSS選擇器

2022-05-10 07:49:40

CSS選擇器

2009-07-16 11:02:33

Swing文件選擇器

2010-09-07 11:14:32

CSS屬性選擇器CSS

2010-09-07 11:31:23

CSS派生選擇器CSS

2010-08-26 12:53:40

CSSid選擇器

2010-09-06 08:52:00

CSS選擇器

2023-01-30 08:42:33

CSS選擇器性能

2010-12-27 16:01:45

jQuery選擇器

2010-08-26 12:47:15

CSSclass
點贊
收藏

51CTO技術棧公眾號

久久九九精品99国产精品| 欧美日韩天天操| 视频精品导航| 91国偷自产一区二区三区观看 | 99久久亚洲一区二区三区青草| 国产伦理久久久| 日韩欧美一区免费| 欧美一区二区三区…… | 无码少妇一区二区三区芒果| 国产成人福利片| 亚洲精品一区二区三| 媚黑女一区二区| 日韩精品欧美专区| 久久蜜桃资源一区二区老牛| 国产一区二区不卡视频在线观看 | 日本在线一二三| 亚洲一区二区三区四区在线| 黄色免费网址大全| 日本一区二区成人在线| 亚洲一级免费观看| 亚洲精品自拍动漫在线| julia中文字幕久久亚洲蜜臀| 一区二区三区欧美| 你懂的好爽在线观看| 欧美美女黄视频| 97人澡人人添人人爽欧美| 亚洲欧美国产日韩天堂区| 激情都市亚洲| 中文字幕久热精品视频在线| 国产一区二区三区精品在线观看| 久久久久久久久久久国产| 红桃成人av在线播放| 国产麻豆乱码精品一区二区三区 | 国产精品污网站| 免费免费啪视频在线观看| 午夜视频一区在线观看| 中文字幕日本在线| 亚洲成色777777女色窝| 成人mm视频在线观看| 午夜精品久久久久久久白皮肤| 日韩av字幕| 国产精品国产亚洲精品看不卡15 | 91久久国产婷婷一区二区| 欧美日韩亚洲一区在线观看| 视频一区视频二区视频| 成人av网站在线观看免费| 男人的天堂www| 欧美日韩成人高清| www.com.cn成人| 91精品国产高清自在线看超| 欧美xxx在线观看| 欧美性受黑人性爽| 亚洲精品欧美专区| 一区二区三区伦理| 欧美精品xxx| 午夜久久一区| 91免费国产精品| 亚洲色图视频网站| www.在线视频| 欧美激情欧美激情| 在线播放不卡| 尤物av无码色av无码| 午夜视频在线观看一区二区三区| 男人天堂亚洲| 欧美一区深夜视频| 日本不卡视频在线| 国产激情视频网址| 亚洲精品不卡在线| 久久99蜜桃| av磁力番号网| 一本一本久久a久久精品综合麻豆| 大胆人体一区二区| 成人午夜小视频| 97久久超碰精品国产| 91ph在线| 欧美一级免费视频| 国产乱码精品一区二区三区av| 动漫成人在线| 久久天天躁狠狠躁夜夜躁2014| 亚洲经典自拍| 免费播放av| xvideos亚洲| 噜噜噜91成人网| 黄色直播在线| 九九热视频这里只有精品| 亚洲一区一卡| 少妇激情av一区二区三区| 在线亚洲欧美视频| 亚洲精选成人| 美女被人操视频在线观看| 久久人人爽人人爽爽久久| 奶水喷射视频一区| 亚洲字幕成人中文在线观看| 免费91在线视频| 黄色资源网久久资源365| 日韩a在线观看| 98视频在线噜噜噜国产| 成人污污视频在线观看| 久久久123| 精品国产乱码久久久久软件 | 亚洲最大黄网| 日日躁夜夜躁aaaabbbb| 亚洲精品电影网| 99精品视频网| 日韩精品系列| 国产成人精品久久亚洲高清不卡| 久久久久国产精品麻豆ai换脸 | 国产精品久久久久蜜臀 | 国产乱子伦视频一区二区三区| 成人在线观看一区| 国产精品久久久久久久久久99| 99国产精品99久久久久久| а√在线中文在线新版| 玛丽玛丽电影原版免费观看1977| 狠狠干狠狠久久| 日本大胆欧美| 蜜臀一区二区三区| 日韩av电影在线播放| 亚洲欧美综合另类在线卡通| 国产一区二区av在线| 5月婷婷6月丁香| 久久在精品线影院精品国产| 国产成人av电影| av一区在线| 欧美网站免费观看| 精品中文字幕在线2019| 久久久亚洲国产美女国产盗摄| 日韩一区二区三免费高清在线观看| 亚洲理论电影在线观看| 中文字幕欧美日韩精品| 91小视频在线| 精品少妇一区| 午夜爽爽视频| 4444kk亚洲人成电影在线| 在线一区二区视频| 欧美一级视频| 免费在线小视频| 国产69精品久久久久久久| 久久综合免费视频影院| 国产精品乱码人人做人人爱| 久久av导航| 国产在线资源| 日本在线观看一区| 亚洲一区999| 欧美激情一区在线观看| 精品99久久| 国产爆初菊在线观看免费视频网站| 国产日韩三区| 日韩久久精品电影| 久久免费的精品国产v∧| 欧美一区二区三区红桃小说| 三级视频在线播放| 视频一区二区综合| 丝袜亚洲欧美日韩综合| 久久久久久黄色| 成人精品影院| av大大超碰在线| 欧美国产综合在线| 97精品国产aⅴ7777| 精品欧美国产一区二区三区| 久久激情网站| 亚洲日日夜夜| 蜜臀在线观看| 亚洲国产成人不卡| 欧美二区在线播放| 欧美日韩免费区域视频在线观看| 亚洲国产电影| 四虎永久精品在线| 免费成人高清| 日韩久久久久久久| 久久精品视频亚洲| 亚洲最大成人综合| 首页国产欧美久久| 日韩精品一级| 黄色影院在线播放| 国产一区二区片| 国产精品免费视频xxxx| 精品卡一卡二卡三卡四在线| 久久婷婷国产综合国色天香| 亚洲精品2区| av福利在线导航| 成人毛片高清视频观看| 鲁鲁视频www一区二区| 久久久久久久久久久免费 | 日韩美女中文字幕| 欧美一区二区三区在线观看| 菠萝蜜视频在线观看一区| 成人午夜av| 性欧美hd调教| 日韩精品123| 欧美极品欧美精品欧美| 成人自拍爱视频| 欧美激情网友自拍| 精品久久国产字幕高潮| 亚洲精品高清在线观看| 国产一区二区三区免费看| 久久精品亚洲人成影院| 国产精品一区二区三区www| 好了av在线| 黄页免费在线观看|