最近业余时间一直在学习React hooks,以及RxJS。就想着能不能在实际项目中将React hooks和RxJS结合起来使用,突发奇想查阅了一下资料,发现一个人气较高的开源项目,学习一下。

rxjs-hooks

rxjs-hooks是一个开源项目:LeetCode-OpenSource/rxjs-hooks。

rxjs-hooks 有完整的测试用例,测试覆盖率 100%。目前一共只有两个 hooks:​useObservable​和 ​useEventCallback​。还是直接用例子解释来得简单明了,让我们首先回想一下,怎么在 React Component 中创建、订阅,并销毁一个流。大概是这个样子:点击查看在线效果

class App extends React.Component {state = {val: 0};componentDidMount() {const numbers = Rx.Observable.interval(1000);this.subscription = numbers.subscribe(val => {console.log("val=", val);this.setState({ val });});}componentWillUnmount() {this.subscription.unsubscribe();}render() {return <h1>{this.state.val}</h1>;}
}
复制代码

手动订阅,手动管理声明周期,还要通过 React 中的 state 搭建一个与 render 函数 (UI) 之间的桥梁。那么使用 rxjs-hooks 之后呢:点击查看在线效果

function App() {const val = useObservable(() => Rx.Observable.interval(1000), 0);return <h1>{val}</h1>;
}
复制代码

没有手动订阅,不需要再理会生命周期的管理。只需要一个不到 1kb 的依赖,就能在 React 世界里快乐地拥抱 RxJS 。

API 详解

1. useObservable

案例 1:无默认值,不依赖外部状态

function Timer() {const val = useObservable(() => interval(1000));return <h1>{val}</h1>
}
复制代码

在此案例中,仅传递了第一个参数,它是 Observable 的工厂函数,需要返回一个 Observable,而 useObservable 的返回值永远是流的最新值。首次渲染只有一个内容为空的h1标签,1秒后,内容变为0,2 秒后,内容变为1

案例 2:有默认值

function Timer() {const val = useObservable(() => interval(1000), -1);return <h1>{val}</h1>
}
复制代码

在第二个案例中,我们传递了第二个参数,它就是 ​val​ 的默认值。所以在这种情况下,首次渲染的内容不再为空,而是 ​-1​。

案例 3:依赖上一次的执行状态

如果你需要在流中获得上一次输出的结果时,工厂函数会传入一个 ​state$​ 流来帮助你做到这一点。(此处一定要使用 ​withLatestFrom​ 来结合这个流,否则会造成无限循环)。点击查看在线效果

function App() {const val = useObservable(state$ =>Rx.Observable.interval(1000).withLatestFrom(state$).map(([index, prevVal]) => index + prevVal),0);// first render:    0// 1s later:        1    (1 + 0)// 2s later:        3    (2 + 1)// 3s later:        6    (3 + 3)// 4s later:       10    (4 + 6)return <h1>{val}</h1>;
}
复制代码

案例 4:依赖外部状态

工厂函数可以依赖一些外部传入的状态,通过 useObservable 的第三个参数传入(和 useEffect,useMemo 的接口类似)

如果传递了第三个参数,那么工厂函数中,就会得到两个流,分别为 ​input​。在下面的例子中,​input​ 流。点击查看在线效果

function Timer({ a }) {const [b, setB] = useState(0);const val = useObservable((inputs$, _state$) => timer(1000).pipe(combineLatest(inputs$),map(([_, [a, b]]) => a + b),),0,[a, b],);return (<div><h1>{val}</h1><button onClick={() => setB(b + 10)}>b: +10</button></div>)
}
function App() {const [a, setA] = useState(100);return (<div><Timer a={a} /><button onClick={() => setA(a + 100)}>a: +100</button></div>);
}
复制代码

2. useEventCallback

我们相信 RxJS 不仅十分擅长处理数据流,同时在处理一些交互逻辑上也有很大的帮助。因此我们设计了第二个 API ​useEventCallback​,它接受的三个参数。其中,后两个参数与 ​useObservable​ 有很大相似之处,因此这边着重介绍第一个形参与返回值。

首先来看看下面的例子,可以很容易地看出:返回值和 useEventCallback 不一样了,它会返回一个 ​[callback, value]​ 元组。同时接受的工厂函数,接受一个event$参数,每当 ​callback​ 被调用时,​event$​ 流总会有一个新的值流出。而 ​useEventCallback​ 函数的第二个参数依旧是我们熟悉的默认值。点击查看在线效果

function App() {const [clickCallback, [description, x, y]] = useEventCallback((event$) =>event$.pipe(map((event) => [event.target.innerHTML, event.clientX, event.clientY]),),["nothing", 0, 0],)return (<div className="App"><h1>click position: {x}, {y}</h1><h1>"{description}" was clicked.</h1><button onClick={clickCallback}>click me</button><button onClick={clickCallback}>click you</button><button onClick={clickCallback}>click him</button></div>);
}
复制代码

扩展阅读

前端早读课【第1434期】渔人和Rxjs的故事

转载于:https://juejin.im/post/5ce53b4f6fb9a07ed22444f4

RxJS + React hooks相关推荐

  1. 【译】什么是React Hooks

    原文:What are React Hooks? 作者:Robin Wieruch 译者:博轩 React Hooks 于 2018年10月的React Conf 中引入,作为在 React 函数组件 ...

  2. 精读《怎么用 React Hooks 造轮子》

    1 引言 上周的 精读<React Hooks> 已经实现了对 React Hooks 的基本认知,也许你也看了 React Hooks 基本实现剖析(就是数组),但理解实现原理就可以用好 ...

  3. react hooks使用_为什么要使用React Hooks?

    react hooks使用 The first thing you should do whenever you're about to learn something new is ask your ...

  4. react hooks使用_如何使用React和Hooks检测外部点击

    react hooks使用 by Andrei Cacio 通过安德烈·卡西奥(Andrei Cacio) 如何使用React和Hooks检测外部点击 (How to detect an outsid ...

  5. react hooks使用_如何使用Hooks将React类组件转换为功能组件

    react hooks使用 by Balaganesh Damodaran 通过Balaganesh Damodaran 如何使用Hooks将React类组件转换为功能组件 (How to conve ...

  6. 探React Hooks

    前言 众所周知,hooks在 React@16.8 中已经正式发布了.而下周周会,我们团队有个同学将会仔细介绍分享一下hooks.最近网上呢有不少hooks的文章,这不免激起了我自己的好奇心,想先行探 ...

  7. 使用React Hooks你可能会忽视的作用域问题

    前言 其实React Hooks已经推出来一段时间了,直到前一阵子才去尝试了下,看到的一些博客都是以API的使用居多,还有一些是对于原理的解析.而我这篇文章想写的是关于React Hooks使用中的作 ...

  8. dw按钮图片滚动js_使用 React Hooks 实现仿石墨的图片预览插件(巨详细)

    点击上方"前端教程",选择"星标" 每天前端开发干货第一时间送达! 作者:DARRELL https://juejin.im/post/5e9bf299f265 ...

  9. 通过 React Hooks 声明式地使用 setInterval

    2019独角兽企业重金招聘Python工程师标准>>> 本文由云+社区发表 作者:Dan Abramov 接触 React Hooks 一定时间的你,也许会碰到一个神奇的问题: se ...

最新文章

  1. C++运算符重载形式--成员函数or友元函数?
  2. 智能音箱二战:国内Q1出货量5倍增长,BAX上屏、扩类、做家居
  3. apk去除签名验证工具安卓版_App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!...
  4. WCF技术剖析之十七:消息(Message)详解(上篇)
  5. ASP.NET 页面验证cookie
  6. linux启动中继服务器失败,Tor中继服务器在Linux里安装配置的流程
  7. Android Tween动画之RotateAnimation实现图片不停旋转
  8. 计算机程序领域专利撰写,干货 | 计算机软件专利撰写模板
  9. amd显卡风扇调节_AMD Crimson驱动程序导致显卡风扇速度过低,官方: 请尽快修复...
  10. VUE项目引入公共样式的styl文件
  11. Qt登录界面实现以及跳转不同界面
  12. 中台服务架构的一点思考
  13. C# 实现自动ADSL拨号
  14. 【转】faster-rcnn原理及相应概念解释
  15. Python生成 gif 动图
  16. Python 计算KDJ指标
  17. 使用O2OA二次开发搭建企业办公平台(十八)流程打印表单设置
  18. ssm+Vue计算机毕业设计智慧工地管理系统(程序+LW文档)
  19. 几种调用扫描仪的方案
  20. 输入'niHao aAz'实现输出为'ni_hao a_az'

热门文章

  1. 手机有一个时钟的标志_STM32F7系统配置控制器(SYSCFG)及复位和时钟控制(RCC)...
  2. jq之mouseleave()
  3. java整属取余数_js取整数、取余数的方法
  4. java定义变量的输入_Terraform中输入变量
  5. 初学JAVA,javaoo小结
  6. 斐波那契数列 青蛙跳台阶 变态跳台阶
  7. cookie里面用到的关键字_晓龙吊打面试官系列:synchronized关键字入门(同步方法与同步代码块)...
  8. 华为手机怎么下载linux命令,在linux命令
  9. 计算机一级查询记录,技巧查看电脑中使用过的记录痕迹的详细教程
  10. java脚本接口自动化测试_接口自动化测试实践的记录