摘要:接上一篇我理想中的狀態管理工具之前說,對于我個人來而言,理想的狀態管理工具只需同時滿足兩個特點簡單易用,并且適合中大型項目完美地支持未能找到一個完美滿足這兩點的,所以我決定自己造了一個叫。把分為和兩類是很好的實踐。
接上一篇:我理想中的狀態管理工具
之前說,對于我個人來而言,理想的狀態管理工具只需同時滿足兩個特點:
簡單易用,并且適合中大型項目
完美地支持 Typescript
未能找到一個完美滿足這兩點的,所以我決定自己造了一個:叫 Stamen。
首先是 簡單易用,并且適合中大型項目,Stamen 的 Api 設計借鑒了 dva、mirror、rematch,但卻更簡單,主要借鑒了它們的 model 的組織方式:state、reducers、effects。把 action 分為 reducer 和 effect 兩類是很好的實踐。
先看看 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,核心的理念包括:
盡量簡潔的 Api,沒有 connect、Provider
使用 React Hooks,拋棄 hoc 和 render props
推薦使用多 store,store 是分形的,更加靈活
為什么不需要 Provider ?
Stamen 默認是多 store,這更靈活簡單 ,所以并不需要使用 Provider 包裹。
為什么使用 Reack Hooks?
用 React Hooks 寫出代碼可讀性更強,可維護性更高,對 Typescript 支持更好,hoc 最大問題是對 Typescript 支持不好,使用 render props 最大問題寫出的代碼有點反人類,當然 hoc 和 render props 和 React Hooks 對比還有其他缺點,具體可以 Hooks 文檔。
之前有一段代碼,用 render props 會產生太多嵌套:
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 改寫,可讀性會大大提高,下面用 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}; })}
接下來是 完美地支持 Typescript,前面是過 hoc 對 Typescript 支持,render props 書寫可讀性差,React Hooks 能很好的平衡這兩點。
下面用幾張 gif 來展示 Stamen 對 Typescript 完美地支持。
圖一: 用鼠標懸停到變量 state 和 action,可以查看它們完整的類型定義。不同于使用 connect 等 hoc,你不要寫任何類型定義,一切都是自動地類型推倒。
圖二: state 的自動補全。
圖三: actions 的自動補全,dispatch 支持兩種類型參數,一種是字符串(action 的函數名),另外一種 actionSelector 函數(類似 redux 的 stateSlector),推薦使用后面一種,開發體驗會更好。
圖四: 使用 actionSelector,方便地跳轉到 action 函數定義處,方便安全地進行重構重命名等操作。
Stamen 的 Api 非常簡單,可以直接看類型定義:
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; }; };
更多關于 Stamen 的使用方法,可以看 github: stamen
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99267.html
摘要:為什么選擇是開發和維護的一種面向對象的編程語言。一在組件組件復用狀態邏輯很難沒有提供將可復用性行為附加到組件的途徑例如,把組件連接到。如此很容易產生,并且導致邏輯不一致。同時,這也是很多人將與狀態管理庫結合使用的原因之一。 前端時間,接觸了hooks,研究了一段時間后感覺使用起來十分方便,正好公司開了一個新的小項目,正好使用hooks來實踐一下。 技術選型 1.為什么選擇umi 在之前...
摘要:現已存在許多成熟的狀態管理解決方案,還有基于的但對于我個人來說,理想的狀態管理工具只需同時滿足兩個特點簡單易用,并且適合中大型項目完美地支持要做到這兩點其實并不簡單。所以我決定自己造一個可能是基于和最好的狀態管理工具 現已存在許多成熟的狀態管理解決方案:Redux、Mobx、Mobx-state-tree,還有基于 Redux 的 Dva.js、Rematch... 但對于我個人來說,...
摘要:顧名思義,受控組件的值由控制,能為與用戶交互的元素提供值,而不受控制的元素不獲取值屬性。另外我發現受控組件更容易理解和于使用。只是一種把組件作為參數的函數,并且與沒有包裝器的組件相比,能夠返回具有擴展功能的新組件。其中三個基本的是,和。 翻譯:瘋狂的技術宅原文:https://www.toptal.com/react/... 本文首發微信公眾號:jingchengyideng歡迎關...
摘要:最近官方在大會上宣布內測將引入。所以我們有必要了解,以及由此引發的疑問。在進一步了解之前,我們需要先快速的了解一些基本的的用法。如何解決狀態有關的邏輯的重用和共享問題。 showImg(https://segmentfault.com/img/remote/1460000016886798?w=1500&h=750); 大家好,我是谷阿莫,今天要將的是一個...,哈哈哈,看到這個題我就...
閱讀 2412·2021-08-18 10:21
閱讀 2519·2019-08-30 13:45
閱讀 2155·2019-08-30 13:16
閱讀 2100·2019-08-30 12:52
閱讀 1363·2019-08-30 11:20
閱讀 2622·2019-08-29 13:47
閱讀 1622·2019-08-29 11:22
閱讀 2760·2019-08-26 12:11