hooks组件封装 react_名符其实的react下一代状态管理器hox
自从 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 支持中英文,链接如下:
- 中文文档 : github.com/umijs/hox/b…
- 英文文档 : github.com/umijs/hox/b…
特性
hox 作为下一代的状态管理器,其具有如下特性:
- 只有一个 API,简单高效,几乎无需学习成本
- 使用 custom Hooks 来定义 model,完美拥抱 React Hooks
- 完美的 TypeScript 支持
- 支持多数据源,随用随取
上手
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相关推荐
- 名符其实的react下一代状态管理器hox
前言 自从React16版本发布Hooks以来,大家纷纷上车尝鲜.毫无疑问,Hooks在一定程度上解决了组件间功能和逻辑复用的问题,在组件间的逻辑的封装和复用确实真香,但Hooks在数据状态的共享方法 ...
- react全局状态管理_rxv: 在React中用Vue3的reactivity包实现状态管理。
前言 React的状态管理是一个缤纷繁杂的大世界,光我知道的就不下数十种,其中有最出名immutable阵营的redux,有mutable阵营的mobx,react-easy-state,在hooks ...
- Recoil 是 React 的状态管理库
Recoil 是 React 的状态管理库,因此你需要将 Recoil 安装到 React 项目中才能使用.创建 React 项目最方便且推荐的方式是使用 Create React App: npx ...
- React/ReactNative 状态管理终于懂了!redux redux-toolkit 与 rematch 对比总结
有同学反馈开发 ReactNative 应用时状态管理不是很明白,这个问题我之前刚接触 React 时也遇到过,看了好多文章和视频才终于明白,不得不说,React 及三方库这方面做的有点过于复杂了! ...
- [react] 状态管理器解决了什么问题?什么时候用状态管理器?
[react] 状态管理器解决了什么问题?什么时候用状态管理器? 专注 view 层 React 官网是这么简介的.JavaScript library for building user inter ...
- [react] 什么时候使用状态管理器?
[react] 什么时候使用状态管理器? 1用户的使用方式复杂 2.不同身份的用户有不同的使用方式(比如普通用户和管理员) 3.多个用户之间可以协作 4.与服务器大量交互,或者使用了WebSocket ...
- flux react php,Vue的Flux框架之Vuex状态管理器
学习vue之前,最重要是弄懂两个概念,一是"what",要理解vuex是什么:二是"why",要清楚为什么要用vuex. Vuex是什么? Vuex 类似 Re ...
- 【视频】React ReduxToolkit状态管理:创建store对象及redux调试工具的安装方法
React ReduxToolkit状态管理:创建store
- [react] 状态管理器它精髓是什么?
[react] 状态管理器它精髓是什么? 统一的数据管理 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题
最新文章
- 控件的实际大小与呈现大小
- Google Protocol Buffers介绍
- oracle以sysdba登陆,oracle 以SYSDBA身份登陆
- 08年美国最值得信赖20大公司排行 谷歌落榜
- 分布式事务中间件 Fescar - 全局写排它锁解读
- 标记语言 编程语言 脚本语言分别有哪些? 区别是什么?
- centos安装Ambari
- oracle数据转成sqlserver,oracle数据库转换到Sqlserver的几点经验
- 一个ContentProvider的典型结构分析
- linux yum未找到命令,解决yum命令失效,vim: command not found
- 5e的训练模式全是英文_四块GPU即可训练BigGAN:「官方版」PyTorch实现出炉
- ESP8266热点配网-Arduino代码分享
- informix 如何下载
- linux操作系统shell脚本编程实验报告,Linux操作系统实验报告|linux实验报告总结
- 《现代操作系统(中文第四版)》课后习题答案 第一章 引论
- unity模型制作(四):绘制一个凹多边形
- 如何使用谷歌“以图找图”图片搜索功能
- npm安装依赖包报ERR问题汇总及处理
- Leetcode 037 解数独 思路详解 python
- SQLyog重置试用时间
热门文章
- 一个优秀的程序员应该如何提高工作效率?
- 程序员如何拓展知识面 推荐几个技术公众号
- 第二十节:一个缺失已久的特性 — module模块
- HTML5新特征、窍门和技术(6~10)
- 【重磅综述】长序列数据分析相关资源哪里找?一文读懂长序列测序数据分析的机遇与挑战!...
- 扩增子和宏基因组数据分析流程和可视化方案—刘永鑫(南京,2020年10月27日)
- Deep Glow for mac(AE高级辉光特效插件)支持ae2021
- 1.9 编程基础之顺序查找 01 查找特定的值 python AC
- linux禁止防火墙命令,LINUX关闭打开防火墙命令
- canvas笔记-使用canvas画圆及点阵的使用