自从 React16 版本发布 Hooks 以来,大家纷纷上车尝鲜。毫无疑问, Hooks 在一定程度上解决了组件间功能和逻辑复用的问题,在组件间的逻辑的封装和复用确实真香,但 Hooks 在数据状态的共享方法略有不足,虽然可以使用 useReducer 实现数据状态管理,但在一定程度上是对 redux 的思想的复用。我们知道 redux 、 Flux 、 dva 等这些 React 状态管理的工具,实际上都是对 action 、 dispatch 、 reducer 、 useStore 、 Provider 、 Context 这些概念的排列组合,概念太多,学习入手成本较高,项目使用都差不多,会有产生许多的模版代码。

hox

既然如此是否有学习成本比较低,入手简单的针对 Hooks 的状态管理器呢?答案是有,其中来自来自蚂蚁金服体验技术部 hox 就是这样一种工具。下面我们从学习、上手、原理几个方法聊聊这个被定为为下一代 React 状态管理器,看看其是否符合其定位的目标。

学习

hox 来自蚂蚁金服体验技术部,其背后的团队在 React 各种实践场景上都有很丰富的经验,因此其后续的维护和迭代还是很靠谱的。可能因为其只有一个 API ,因此其文档也是十分简单的,一眼就能看到头了。这对于我们前端的开发者而言就是很友好的,由于千变万化的前端,各种轮子、各种技术层出不穷,前端的娃娃们表示学不动了。而这种只有一个 API 的工具,我们表示还是可以学的动的。 hox 的详细文档可以参看 github 上的 readme 支持中英文,链接如下:

  1. 中文文档github.com/umijs/hox/b…
  2. 英文文档github.com/umijs/hox/b…

特性

hox 作为下一代的状态管理器,其具有如下特性:

  1. 只有一个 API,简单高效,几乎无需学习成本
  2. 使用 custom Hooks 来定义 model,完美拥抱 React Hooks
  3. 完美的 TypeScript 支持
  4. 支持多数据源,随用随取

上手

hox 的上手使用体验还是很不错的,因为十分简单。talk is cheap,show me code。我们直接上码看看。

import { useState } from "react";import { createModel } from "hox";function useCounter() {  const [count, setCount] = useState(0);  const decrement = () => setCount(count - 1);  const increment = () => setCount(count + 1);  return {    count,    decrement,    increment  };}export default createModel(useCounter);
import useCounterModel from "../models/counter";function App(props) {  const { count, increment, decrement } = useCounterModel();  return (    

{count}

Increment Decrement

);}

使用 hox 就是这么简单,通过 createModel 包装一下将 custom hook 变成 share hook ,就可以在各个组件之间共享数据状态,并实现逻辑封装和复用。

原理

createModel 会创建一个 Executor 组件的实例,并在执行 custom hook , custom hook 的执行结果会被保存起来。最后,它会返回一个新的 share hook 即是 model hook 实现数据和逻辑的共享。源码如下:

import { ModelHook, UseModel } from "./types";import { Container } from "./container";import { Executor } from "./executor";import React, { useEffect, useRef, useState } from "react";import { render } from "./renderer";export function createModel(hook: ModelHook, hookArg?: P) {  // 实例化一个容器,通过发布订阅模式实现对状态改变的推送   const container = new Container(hook);  // 实例化 Executor 组件,当数据发生改变时,notify 所有订阅者进行更新  render(     {        container.data = val;        container.notify();      }}      hook={() => hook(hookArg)}    />  );  // useModel 这是 share hook  const useModel: UseModel = depsFn => {    const [state, setState] = useState(() =>      container ? (container.data as T) : undefined    );    const depsFnRef = useRef(depsFn);    depsFnRef.current = depsFn;    const depsRef = useRef([]);    useEffect(() => {      if (!container) return;      function subscriber(val: T) {        if (!depsFnRef.current) {          setState(val);        } else {          const oldDeps = depsRef.current;          const newDeps = depsFnRef.current(val);          if (compare(oldDeps, newDeps)) {            setState(val);          }          depsRef.current = newDeps;        }      }      container.subscribers.add(subscriber);      return () => {        container.subscribers.delete(subscriber);      };    }, [container]);    return state!;  };  // share hook 代理 custom hook 返回的值  Object.defineProperty(useModel, "data", {    get: function() {      return container.data;    }  });  return useModel;}// 这是 hook 依赖项对比函数function compare(oldDeps: unknown[], newDeps: unknown[]) {  if (oldDeps.length !== newDeps.length) {    return true;  }  for (const index in newDeps) {    if (oldDeps[index] !== newDeps[index]) {      return true;    }  }  return false;}

其原理图如下:

总结

简言之, hox 大道至简,只有一个 API ,但其既能满足逻辑的封装和复用,又能满足状态复用和管理,值得尝试的状态管理器。

hooks组件封装 react_名符其实的react下一代状态管理器hox相关推荐

  1. 名符其实的react下一代状态管理器hox

    前言 自从React16版本发布Hooks以来,大家纷纷上车尝鲜.毫无疑问,Hooks在一定程度上解决了组件间功能和逻辑复用的问题,在组件间的逻辑的封装和复用确实真香,但Hooks在数据状态的共享方法 ...

  2. react全局状态管理_rxv: 在React中用Vue3的reactivity包实现状态管理。

    前言 React的状态管理是一个缤纷繁杂的大世界,光我知道的就不下数十种,其中有最出名immutable阵营的redux,有mutable阵营的mobx,react-easy-state,在hooks ...

  3. Recoil 是 React 的状态管理库

    Recoil 是 React 的状态管理库,因此你需要将 Recoil 安装到 React 项目中才能使用.创建 React 项目最方便且推荐的方式是使用 Create React App: npx ...

  4. React/ReactNative 状态管理终于懂了!redux redux-toolkit 与 rematch 对比总结

    有同学反馈开发 ReactNative 应用时状态管理不是很明白,这个问题我之前刚接触 React 时也遇到过,看了好多文章和视频才终于明白,不得不说,React 及三方库这方面做的有点过于复杂了! ...

  5. [react] 状态管理器解决了什么问题?什么时候用状态管理器?

    [react] 状态管理器解决了什么问题?什么时候用状态管理器? 专注 view 层 React 官网是这么简介的.JavaScript library for building user inter ...

  6. [react] 什么时候使用状态管理器?

    [react] 什么时候使用状态管理器? 1用户的使用方式复杂 2.不同身份的用户有不同的使用方式(比如普通用户和管理员) 3.多个用户之间可以协作 4.与服务器大量交互,或者使用了WebSocket ...

  7. flux react php,Vue的Flux框架之Vuex状态管理器

    学习vue之前,最重要是弄懂两个概念,一是"what",要理解vuex是什么:二是"why",要清楚为什么要用vuex. Vuex是什么? Vuex 类似 Re ...

  8. 【视频】React ReduxToolkit状态管理:创建store对象及redux调试工具的安装方法

    React ReduxToolkit状态管理:创建store

  9. [react] 状态管理器它精髓是什么?

    [react] 状态管理器它精髓是什么? 统一的数据管理 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

最新文章

  1. 控件的实际大小与呈现大小
  2. Google Protocol Buffers介绍
  3. oracle以sysdba登陆,oracle 以SYSDBA身份登陆
  4. 08年美国最值得信赖20大公司排行 谷歌落榜
  5. 分布式事务中间件 Fescar - 全局写排它锁解读
  6. 标记语言 编程语言 脚本语言分别有哪些? 区别是什么?
  7. centos安装Ambari
  8. oracle数据转成sqlserver,oracle数据库转换到Sqlserver的几点经验
  9. 一个ContentProvider的典型结构分析
  10. linux yum未找到命令,解决yum命令失效,vim: command not found
  11. 5e的训练模式全是英文_四块GPU即可训练BigGAN:「官方版」PyTorch实现出炉
  12. ESP8266热点配网-Arduino代码分享
  13. informix 如何下载
  14. linux操作系统shell脚本编程实验报告,Linux操作系统实验报告|linux实验报告总结
  15. 《现代操作系统(中文第四版)》课后习题答案 第一章 引论
  16. unity模型制作(四):绘制一个凹多边形
  17. 如何使用谷歌“以图找图”图片搜索功能
  18. npm安装依赖包报ERR问题汇总及处理
  19. Leetcode 037 解数独 思路详解 python
  20. SQLyog重置试用时间

热门文章

  1. 一个优秀的程序员应该如何提高工作效率?
  2. 程序员如何拓展知识面 推荐几个技术公众号
  3. 第二十节:一个缺失已久的特性 — module模块
  4. HTML5新特征、窍门和技术(6~10)
  5. 【重磅综述】长序列数据分析相关资源哪里找?一文读懂长序列测序数据分析的机遇与挑战!...
  6. 扩增子和宏基因组数据分析流程和可视化方案—刘永鑫(南京,2020年10月27日)
  7. Deep Glow for mac(AE高级辉光特效插件)支持ae2021
  8. 1.9 编程基础之顺序查找 01 查找特定的值 python AC
  9. linux禁止防火墙命令,LINUX关闭打开防火墙命令
  10. canvas笔记-使用canvas画圆及点阵的使用