国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

可能是基于 Hooks 和 Typescript 最好的狀態(tài)管理工具

derek_334892 / 835人閱讀

摘要:接上一篇我理想中的狀態(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

相關(guān)文章

  • React Hooks+Umi+TypeScript+Dva開(kāi)發(fā)體驗(yàn)

    摘要:為什么選擇是開(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 在之前...

    stonezhu 評(píng)論0 收藏0
  • 我理想中狀態(tài)管理工具

    摘要:現(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ō),...

    roadtogeek 評(píng)論0 收藏0
  • React教程:組件,Hooks性能

    摘要:顧名思義,受控組件的值由控制,能為與用戶交互的元素提供值,而不受控制的元素不獲取值屬性。另外我發(fā)現(xiàn)受控組件更容易理解和于使用。只是一種把組件作為參數(shù)的函數(shù),并且與沒(méi)有包裝器的組件相比,能夠返回具有擴(kuò)展功能的新組件。其中三個(gè)基本的是,和。 翻譯:瘋狂的技術(shù)宅原文:https://www.toptal.com/react/... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)...

    edagarli 評(píng)論0 收藏0
  • 「每日一瞥

    摘要:即使中沒(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...

    XboxYan 評(píng)論0 收藏0
  • 10分鐘了解 react 引入 Hooks

    摘要:最近官方在大會(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è)題我就...

    Lucky_Boy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<