摘要:接上一篇我理想中的狀態(tài)管理工具之前說(shuō),對(duì)于我個(gè)人來(lái)而言,理想的狀態(tài)管理工具只需同時(shí)滿足兩個(gè)特點(diǎn)簡(jiǎn)單易用,并且適合中大型項(xiàng)目完美地支持未能找到一個(gè)完美滿足這兩點(diǎn)的,所以我決定自己造了一個(gè)叫。把分為和兩類是很好的實(shí)踐。
接上一篇:我理想中的狀態(tài)管理工具
之前說(shuō),對(duì)于我個(gè)人來(lái)而言,理想的狀態(tài)管理工具只需同時(shí)滿足兩個(gè)特點(diǎn):
簡(jiǎn)單易用,并且適合中大型項(xiàng)目
完美地支持 Typescript
未能找到一個(gè)完美滿足這兩點(diǎn)的,所以我決定自己造了一個(gè):叫 Stamen。
首先是 簡(jiǎn)單易用,并且適合中大型項(xiàng)目,Stamen 的 Api 設(shè)計(jì)借鑒了 dva、mirror、rematch,但卻更簡(jiǎn)單,主要借鑒了它們的 model 的組織方式:state、reducers、effects。把 action 分為 reducer 和 effect 兩類是很好的實(shí)踐。
先看看 Stamen 是怎么使用的:
import React from "react"; import ReactDOM from "react-dom"; import { createStore } from "stamen"; const CounterStore = createStore({ state: { count: 10, }, reducers: { increment(state) { state.count++; }, decrement(state) { state.count--; }, }, effects: { async asyncIncrement(dispatch) { await new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 1000); }); dispatch("increment"); }, }, }); const App = () => { const { get, dispatch } = CounterStore.useStore(); const count = get(state => state.count); return ({count}); }; ReactDOM.render(, document.getElementById("root"));
線上 demo 可以看 (Check on CodeSandbox): Basic | Async
這段代碼涵蓋了 Stamen 的全部 Api,核心的理念包括:
盡量簡(jiǎn)潔的 Api,沒(méi)有 connect、Provider
使用 React Hooks,拋棄 hoc 和 render props
推薦使用多 store,store 是分形的,更加靈活
為什么不需要 Provider ?
Stamen 默認(rèn)是多 store,這更靈活簡(jiǎn)單 ,所以并不需要使用 Provider 包裹。
為什么使用 Reack Hooks?
用 React Hooks 寫出代碼可讀性更強(qiáng),可維護(hù)性更高,對(duì) Typescript 支持更好,hoc 最大問(wèn)題是對(duì) Typescript 支持不好,使用 render props 最大問(wèn)題寫出的代碼有點(diǎn)反人類,當(dāng)然 hoc 和 render props 和 React Hooks 對(duì)比還有其他缺點(diǎn),具體可以 Hooks 文檔。
之前有一段代碼,用 render props 會(huì)產(chǎn)生太多嵌套:
const Counter = create({ count: 0 }); const User = create({ name: "foo" }); const Todo = create({ todos: [] }); const App = () => ({User.get(user => ();{user.name}))}{Todo.get(todo => ({todo.todos.map(item => {))}{item.name}; {Counter.get(s => s.count)}; })}
如果使用 React Hooks 改寫,可讀性會(huì)大大提高,下面用 Stamen 改寫:
const counterStore = CounterStore.useStore(); const userStore = UserStore.useStore(); const todoStore = TodoStore.useStore(); const count = counterStore.get(s => s.count); const name = userStore.get(s => s.name); const todos = TodoStore.get(s => s.todos); const App = () => ({name});{todos.map(item => {{item.name} {count}; })}
接下來(lái)是 完美地支持 Typescript,前面是過(guò) hoc 對(duì) Typescript 支持,render props 書寫可讀性差,React Hooks 能很好的平衡這兩點(diǎn)。
下面用幾張 gif 來(lái)展示 Stamen 對(duì) Typescript 完美地支持。
圖一: 用鼠標(biāo)懸停到變量 state 和 action,可以查看它們完整的類型定義。不同于使用 connect 等 hoc,你不要寫任何類型定義,一切都是自動(dòng)地類型推倒。
圖二: state 的自動(dòng)補(bǔ)全。
圖三: actions 的自動(dòng)補(bǔ)全,dispatch 支持兩種類型參數(shù),一種是字符串(action 的函數(shù)名),另外一種 actionSelector 函數(shù)(類似 redux 的 stateSlector),推薦使用后面一種,開(kāi)發(fā)體驗(yàn)會(huì)更好。
圖四: 使用 actionSelector,方便地跳轉(zhuǎn)到 action 函數(shù)定義處,方便安全地進(jìn)行重構(gòu)重命名等操作。
Stamen 的 Api 非常簡(jiǎn)單,可以直接看類型定義:
interface Opt{ state: S; reducers?: R; effects?: E; } declare function createStore, E extends Effects>(opt: Opt): { useStore: () => { get:(selector: Selector
) => P; dispatch: (action: ActionSelector| keyof R | keyof E, payload?: any) => void; }; };
更多關(guān)于 Stamen 的使用方法,可以看 github: stamen
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/99267.html
摘要:為什么選擇是開(kāi)發(fā)和維護(hù)的一種面向?qū)ο蟮木幊陶Z(yǔ)言。一在組件組件復(fù)用狀態(tài)邏輯很難沒(méi)有提供將可復(fù)用性行為附加到組件的途徑例如,把組件連接到。如此很容易產(chǎn)生,并且導(dǎo)致邏輯不一致。同時(shí),這也是很多人將與狀態(tài)管理庫(kù)結(jié)合使用的原因之一。 前端時(shí)間,接觸了hooks,研究了一段時(shí)間后感覺(jué)使用起來(lái)十分方便,正好公司開(kāi)了一個(gè)新的小項(xiàng)目,正好使用hooks來(lái)實(shí)踐一下。 技術(shù)選型 1.為什么選擇umi 在之前...
摘要:現(xiàn)已存在許多成熟的狀態(tài)管理解決方案,還有基于的但對(duì)于我個(gè)人來(lái)說(shuō),理想的狀態(tài)管理工具只需同時(shí)滿足兩個(gè)特點(diǎn)簡(jiǎn)單易用,并且適合中大型項(xiàng)目完美地支持要做到這兩點(diǎn)其實(shí)并不簡(jiǎn)單。所以我決定自己造一個(gè)可能是基于和最好的狀態(tài)管理工具 現(xiàn)已存在許多成熟的狀態(tài)管理解決方案:Redux、Mobx、Mobx-state-tree,還有基于 Redux 的 Dva.js、Rematch... 但對(duì)于我個(gè)人來(lái)說(shuō),...
摘要:顧名思義,受控組件的值由控制,能為與用戶交互的元素提供值,而不受控制的元素不獲取值屬性。另外我發(fā)現(xiàn)受控組件更容易理解和于使用。只是一種把組件作為參數(shù)的函數(shù),并且與沒(méi)有包裝器的組件相比,能夠返回具有擴(kuò)展功能的新組件。其中三個(gè)基本的是,和。 翻譯:瘋狂的技術(shù)宅原文:https://www.toptal.com/react/... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)...
摘要:即使中沒(méi)有錯(cuò)誤,仍然會(huì)執(zhí)行,這一點(diǎn)一般都是知道的。我們認(rèn)為這是正確的前進(jìn)道路,兼具戰(zhàn)略性和務(wù)實(shí)性降低使用門檻開(kāi)發(fā)人員遷移到的障礙之一是從到的并不輕松的遷移。下一步將通過(guò)一系列功能和插件為的平滑過(guò)渡提供支持,并以此回饋社區(qū)。 showImg(https://segmentfault.com/img/remote/1460000017516912?w=1200&h=630); useSt...
摘要:最近官方在大會(huì)上宣布內(nèi)測(cè)將引入。所以我們有必要了解,以及由此引發(fā)的疑問(wèn)。在進(jìn)一步了解之前,我們需要先快速的了解一些基本的的用法。如何解決狀態(tài)有關(guān)的邏輯的重用和共享問(wèn)題。 showImg(https://segmentfault.com/img/remote/1460000016886798?w=1500&h=750); 大家好,我是谷阿莫,今天要將的是一個(gè)...,哈哈哈,看到這個(gè)題我就...
閱讀 2418·2021-08-18 10:21
閱讀 2528·2019-08-30 13:45
閱讀 2159·2019-08-30 13:16
閱讀 2121·2019-08-30 12:52
閱讀 1370·2019-08-30 11:20
閱讀 2630·2019-08-29 13:47
閱讀 1628·2019-08-29 11:22
閱讀 2766·2019-08-26 12:11