资讯专栏INFORMATION COLUMN

可能是基于 Hooks 和 Typescript 最好的状态管理工具

derek_334892 / 733人阅读

摘要:接上一篇我理想中的状态管理工具之前说,对于我个人来而言,理想的状态管理工具只需同时满足两个特点简单易用,并且适合中大型项目完美地支持未能找到一个完美满足这两点的,所以我决定自己造了一个叫。把分为和两类是很好的实践。

接上一篇:我理想中的状态管理工具

之前说,对于我个人来而言,理想的状态管理工具只需同时满足两个特点:

简单易用,并且适合中大型项目

完美地支持 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99267.html

相关文章

  • React Hooks+Umi+TypeScript+Dva开发体验

    摘要:为什么选择是开发和维护的一种面向对象的编程语言。一在组件组件复用状态逻辑很难没有提供将可复用性行为附加到组件的途径例如,把组件连接到。如此很容易产生,并且导致逻辑不一致。同时,这也是很多人将与状态管理库结合使用的原因之一。 前端时间,接触了hooks,研究了一段时间后感觉使用起来十分方便,正好公司开了一个新的小项目,正好使用hooks来实践一下。 技术选型 1.为什么选择umi 在之前...

    stonezhu 评论0 收藏0
  • 我理想中状态管理工具

    摘要:现已存在许多成熟的状态管理解决方案,还有基于的但对于我个人来说,理想的状态管理工具只需同时满足两个特点简单易用,并且适合中大型项目完美地支持要做到这两点其实并不简单。所以我决定自己造一个可能是基于和最好的状态管理工具 现已存在许多成熟的状态管理解决方案:Redux、Mobx、Mobx-state-tree,还有基于 Redux 的 Dva.js、Rematch... 但对于我个人来说,...

    roadtogeek 评论0 收藏0
  • React教程:组件,Hooks性能

    摘要:顾名思义,受控组件的值由控制,能为与用户交互的元素提供值,而不受控制的元素不获取值属性。另外我发现受控组件更容易理解和于使用。只是一种把组件作为参数的函数,并且与没有包装器的组件相比,能够返回具有扩展功能的新组件。其中三个基本的是,和。 翻译:疯狂的技术宅原文:https://www.toptal.com/react/... 本文首发微信公众号:jingchengyideng欢迎关...

    edagarli 评论0 收藏0
  • 「每日一瞥

    摘要:即使中没有错误,仍然会执行,这一点一般都是知道的。我们认为这是正确的前进道路,兼具战略性和务实性降低使用门槛开发人员迁移到的障碍之一是从到的并不轻松的迁移。下一步将通过一系列功能和插件为的平滑过渡提供支持,并以此回馈社区。 showImg(https://segmentfault.com/img/remote/1460000017516912?w=1200&h=630); useSt...

    XboxYan 评论0 收藏0
  • 10分钟了解 react 引入 Hooks

    摘要:最近官方在大会上宣布内测将引入。所以我们有必要了解,以及由此引发的疑问。在进一步了解之前,我们需要先快速的了解一些基本的的用法。如何解决状态有关的逻辑的重用和共享问题。 showImg(https://segmentfault.com/img/remote/1460000016886798?w=1500&h=750); 大家好,我是谷阿莫,今天要将的是一个...,哈哈哈,看到这个题我就...

    Lucky_Boy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<