一、

本文章不会对RxJS的原理进行讲解,仅讨论如何在vue中对RxJS进行集成

1、30天精通 RxJS

这是一个台湾开发者编写的关于RxJS的教程,教程涉及到原理解析、简易实现,以及常用operator的介绍。

2、学习RxJS operator

各种常用操作符的作用与例子,可以结合RxJS的官方文档进行查阅。

二、Vue简单集成RxJS

想要在Vue中使用RxJS,只需要如下引用即可,当然,更多引用方法可以参考官方文档,比如按需引入

import Rx from 'rxjs/Rx'
如果你想在vue中使用RxJS的体验更好,这里推荐使用vue-rx这个官方维护的库,使用如下:
import Vue from 'vue'
import VueRx from 'vue-rx'
import Rx from 'rxjs/Rx'Vue.use(VueRx, Rx)
复制代码

这样,在Vue实例当中就会多了subscriptions这个钩子函数,他的用法类似data,使用如下所示:

<template><div><span>姓名:{{ name$ }}</span><span>年龄:{{ age$ }}</span><button v-stream:click="setName$">点击设置name的值</button></div>
</template><script>
export default {domStreams: ['setName$'],subscriptions () {return {age$: Rx.Observable.of(23).map(data => data),name$: this.setName$.map(e => 'myName').startWith('')}}
}
</script>
复制代码

如上所示,Rx.Observable.of(23)在被订阅时会被发出值23,this.setName$则是一个流事件,它在domStreams中定义,实际它是一个Subject(具体可查阅RxJS中对Subject的定义),在用户点击按钮的时候则会发出该点击源的数据,如上图的map operator中,会接收数据源发出的event对象(这里我们没有使用该对象,仅仅是返回一个我们定义的字符串'myName'),startWith则是初始化name$的值为空字符串,这里vue-rx已经帮我们做了一个隐式的subscribe绑定,所以值23会马上发出最后赋值到age$上,进而绑定到视图,在这里,我们可以把age$与name$看成是一个有数据源发出的可观察流的结果,这条流是响应的,初始发出的值会经过各种operator处理后响应到页面上。

三、集成vue-rx后使用RxJS

github地址

该项目采取了parcel构建、示例包括原生使用与集成vue-rx后使用的对比、事件如何使用、以及常用operator的示例(包含switchMap、concatMap、exhaustMap等的使用场景选择)

1、创建Observeble

<template><div><h3>demo2 创建将数据转化成Observable方式</h3><p>字符串:{{ str$ }}</p><p>数组: <span v-for="(num, index) in arr$" :key="index">{{ num }}</span></p><p>对象:{{ obj$.a }}</p><p>布尔值:{{ bool$ }}</p><p>promise:{{ promise$ }}</p><p>interval: {{ interval$ }}</p></div>
</template><script>
import Rx from 'rxjs/Rx'export default {subscriptions () {return {/*** 普通数据类型都可以用of进行转换* promise对象可用from或者fromPromise* interval可在给定时间区间内发出自增数字*/str$: Rx.Observable.of('str'),arr$: Rx.Observable.of([1, 2, 3]),obj$: Rx.Observable.of({ a: 'test-obj' }),bool$: Rx.Observable.of(true),promise$: Rx.Observable.fromPromise(this.getPromise()),interval$: Rx.Observable.interval(1000)}},methods: {getPromise () {return new Promise((resolve, reject) => {setTimeout(() => {resolve('promise')}, 1000)})}}
}
</script>
复制代码

创建数据流后,用法类似data,可将数据流的结果跟视图进行绑定

2、事件的使用

// 没有集成vue-rxexport default {...// 需要获取dom,所以必须是mounted后执行才能成功mounted () {// fromEvent可以将dom绑定事件并转化成Observable可观察对象Rx.Observable.fromEvent(this.$refs['btn'], 'click').subscribe(e => {this.data = '成功获取data'})},...
}// 集成vue-rx后
<template><button class="btn" v-stream:click="getData$">点击获取数据</button>
</template><script>
export default {...// v-stream事件可以统一写在这里,具体可以看vue-rx的使用domStreams: ['getData$'],subscriptions () {return {data$: this.getData$// map操作符主要用于映射数据,这里我们直接返回了一个字符串.map(e => {return '成功获取data'})}}
}
</script>
复制代码

3、switchMap、concatMap、exhaustMap使用

一般这几个operator,会与http请求结合使用,下面我们看些简单用法,点击后将当前流映射成新的流

<template><div><h3>demo4 各种map方法运用</h3><button class="btn" v-stream:click="getConcatMapCount$">点击获取concatMapCount$</button><p>{{ concatMapCount$ }}</p><button class="btn" v-stream:click="getSwitchMapCount$">点击获取switchMapCount$</button><p>{{ switchMapCount$ }}</p><button class="btn" v-stream:click="getExhaustMapCount$">点击获取exhaustMapCount$</button><p>{{ exhaustMapCount$ }}</p></div>
</template><script>
import Rx from 'rxjs/Rx'export default {data () {return {count: 0}},domStreams: ['getConcatMapCount$','getSwitchMapCount$','getExhaustMapCount$'],subscriptions () {/*** 下面的operator会把一个Observable转化成另外一个Observable* 通过返回一个观察流继续处理数据*/return {/*** 当你连续点击按钮多次获取数据时,cancatMap会将获取到的数据按队列发出*/concatMapCount$: this.getConcatMapCount$.concatMap((e) => {return Rx.Observable.from(this.getCount())}),/*** 当你连续点击按钮多次获取数据时,switchMap只会将最后一个点击发出的值发出,前面发出的值会被吞掉*/switchMapCount$: this.getSwitchMapCount$.switchMap((e) => {return Rx.Observable.from(this.getCount())}),/*** 当你连续点击按钮多次时,exhaustMap仅执行一次,在第一次值发出后,才可以继续点击下一次发出值*/exhaustMapCount$: this.getExhaustMapCount$.exhaustMap(e => {return Rx.Observable.from(this.getCount())})}},methods: {getCount () {return new Promise((resolve, reject) => {this.count++setTimeout(() => {resolve(this.count)}, 2000)})}}
}
</script>
复制代码

上面的getCount当成是2秒后响应的http请求,当你连续点击的时候,这几个map operator会有不一样的行为。

比如concatMap在多次点击后会每隔两秒就发送一个递增的count,而switchMap在多次点击后,会只发出最后一次点击的count,比如我点了3次,switchMapCount$在2秒后会显示3,而不是1,exhaustMap则是第一次点击没有响应前不会执行后续的点击操作,直到响应后的点击才有效。

四、关于Rx5与Rx6

上面的仓库是基于Rx5编写的示例,而新出的Rx6在api上有些变动,调用operator的方式不再是链式调用,而是通过传入pipe operator进行组合使用,还有Observable对象的引用也发生了改变,具体可以参考官方文档

RxJS实践,Vue如何集成RxJS相关推荐

  1. rxjs 怎么使用_使用RxJS Observables进行SUPER SAIYAN

    rxjs 怎么使用 I loved DragonBall Z as a kid, and still love it as an adult. 我从小就爱DragonBall Z,但从小到大仍然喜欢它 ...

  2. vue中集成的ui组件库_Vue组件可使用Vault Flow通过Braintree集成PayPal付款

    vue中集成的ui组件库 Vue Braintree PayPal按钮 (Vue Braintree PayPal button) Vue component to integrate PayPal ...

  3. 【ZRender 渲染引擎 - 贰】 | Vue 框架集成与绘制其他图元

    theme: cyanosis 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 8 天,点击查看活动详情 1. Vue 中使用 ZRender 上一篇中,我们通过最原始的方式 ...

  4. UNI-APP/VUE 项目集成 微信SDK /微信开放标签 教程和避坑指南(下)——微信开放标签篇

    UNI-APP/VUE 项目集成 微信开放标签 教程和避坑指南 文章同步发布于

  5. tinymce--一款非常好用的富文本编辑器 VUE如何集成tinymce编辑器

    博客(coder的自我修养)原文链接:tinymce--一款非常好用的富文本编辑器 vue集成tinymce编辑器 - coder的自我修养 TinyMC编辑器简介 TinyMCE是一款易用.且功能强 ...

  6. vue项目集成乾坤(qiankun)微前端

    vue项目集成qiankun微前端 集成乾坤微前端主应用: 1.安装 2.main.js中进行配置 3.配置路由 4.将主应用路由模式设置为history模式 子应用中配置(子应用无需安装乾坤) 1. ...

  7. 21. Spring Boot 2.x最佳实践之 HTTPS 集成

    Spring Boot 2.x最佳实践之 HTTPS 集成 1. HTTPS 科普篇 1.1 什么是HTTP? 1.2 什么是HTTPS? 1.3 HTTP 和HTTPS 的区别 1.4 HTTPS ...

  8. UNI-APP/VUE 项目集成 微信SDK /微信开放标签 教程和避坑指南

    UNI-APP/VUE 项目集成微信SDK教程和避坑指南 文章同步发布于

  9. vue快速集成Fullcalendar日程排班

    vue快速集成Fullcalendar日程排班 官方文档地址:https://fullcalendar.io/docs/vue 1. 安装以下FullCalendar依赖 npm install -- ...

最新文章

  1. HttpUnit学习笔记
  2. Scrum Mastery:有效利用组织的5个步骤
  3. 深入理解c#(第三版)(文摘)
  4. linux rpm安装不成功,rpm 包不能成功安装
  5. ASP.NET之间数据的传递(未完)
  6. 机房管理系列之工作站
  7. 我们的目标是安全有效支持业务的信息处理技术平台
  8. 静态代码块和单例混合
  9. 高仿微信聊天界面长按弹框样式
  10. 卧槽,又来一个 Java 神器!!
  11. 第12课:生活中的构建模式——想要车还是庄园
  12. 驾驶本到期换新,要想照片拍的好看,办理不耽误时间请按照以下步骤进行
  13. BZOJ 2429: [HAOI2006]聪明的猴子
  14. XCTF-攻防世界CTF平台-Web类——19、mfw(.Git源代码泄露、php的assert断言)
  15. 计算机视觉牛人、网站、资源
  16. 【案例分享】让新时代教育发展与“数”俱进
  17. python从网址爬图片协程_python协程gevent案例 爬取斗鱼图片过程解析
  18. 分子反应动力学有哪些最新发表的毕业论文呢?
  19. 目标检测——卷积神经网路基础知识
  20. 不要在寂寞的时候爱谁

热门文章

  1. kafka学习_《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 RabbitMQ
  2. python递归函数特点_python中对递归函数的理解
  3. python用代码表示5与2的整除_Python教程5:Python 2.x和Python 3.x的区别有哪些?
  4. python下面代码是什么_python代码下面__name__= __main__怎么使用 作用是什么?
  5. 3288 android5.1 编译,RK3288編譯 Android 5.1 固件
  6. oracle索引图文解析,oracle索引介绍(图文详解)
  7. 卡尔曼滤波与组合导航原理_卫星知识科普:一种基于卫星共视的卡尔曼滤波算法!...
  8. 处理文件和文件夹的模块---os
  9. 用栈实现队列与用队列实现栈
  10. 【企业管理】如何降低内部成本