vue-rx的初步使用教程


Posted in Javascript onSeptember 21, 2018

一、各文档介绍

1、rxjs官网

2、vue-rxjs地址

二、环境搭建

1、使用vue-cli构建一个项目

2、安装vue-rx的依赖包

yarn add rxjs
yarn add rxjs-compat
yarn add vue-rx

3、在src/main.js中配置使用rxjs

// 使用vueRx
import VueRx from 'vue-rx';
import Rx from 'rxjs/Rx'

Vue.use(VueRx, Rx);

三、没有使用vue-rx的时候

1、关于属性的使用

import { Observable } from 'rxjs';
export default {
 data() {
  return {
   name: new Observable.of('张三')
  }
 }
};

2、关于事件的使用

import { Observable } from 'rxjs';
export default {
 data() {
  return {
   name: new Observable.of('张三'),
  }
 },
 mounted () {
  new Observable.fromEvent(this.$refs.btn, 'click').subscribe(e => {
   this.name = '哈哈';
  })
 }
};

四、结合vue-rx的使用

1、项目中集成了vue-rx的时候会在vue中新增一个钩子函数subscriptions,和之前的data类似的使用

2、domStreams是一个数组用来存放事件

3、属性的使用

export default {
 name: 'HelloWorld',
 data () {
  return {
   msg: 'Welcome to Your Vue.js App'
  }
 },
 domStreams: ['setName$', 'resetMsg$'],
 subscriptions() {
  return {
   // 发送一个普通的值
   name: new Observable.of('张三'),
   // 发送一个修改的值
   age$ : Observable.of(20).map(item => item + 10),
   // 定义发送一个数组
   arr$: new Observable.of(['第一本书', '第二本书']),
   // 发送一个数组
   obj$: new Observable.of({ 
    a: 'test-obj',
    name: '呵呵' 
   }),
   // 发送一个promise函数
   promise$: new Observable.fromPromise(this.getPromise()),
   // 定时器
   interval$: new Observable.interval(1000)
  }
 },
 methods: {
  getPromise() {
   return new Promise((resolve, reject) => {
    setTimeout(() => {
     resolve('promise');
    }, 1000)
   })
  }
 },
}

5、事件的使用

1.在视图中定义事件

<button v-stream:click="setName$">点击按钮设置值</button>

2.在domStreams中定义

domStreams: ['setName$'],

3、在subscriptions定义事件赋值给哪个变量

name$: this.setName$.map(e => 'hello'.toUpperCase()),

六、关于switchMap、concatMap、exhaustMap的使用

1、定义事件

<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>

2、定义事件名

domStreams: ['getConcatMapCount$', 'getSwitchMapCount$', 'getExhaustMapCount$'],

3、触发事件

import { Observable } from 'rxjs';
export default {
 data() {
  return {
   count: 0,
  }
 },
 domStreams: ['getConcatMapCount$', 'getSwitchMapCount$', 'getExhaustMapCount$'],
 subscriptions() {
  return {
   // 当你连续点击按钮多次获取数据时,cancatMap会将获取到的数据按队列发出
   concatMapCount$: this.getConcatMapCount$.concatMap(e => {
    return new Observable.from(this.getCount());
   }),
   // 当你连续点击按钮多次获取数据时,switchMap只会将最后一个点击发出的值发出,前面发出的值会被吞掉
   switchMapCount$: this.getSwitchMapCount$.switchMap(e => {
    return new Observable.from(this.getCount());
   }),
   // 当你连续点击按钮多次时,exhaustMap仅执行一次,在第一次值发出后,才可以继续点击下一次发出值
   exhaustMapCount$: this.getExhaustMapCount$.exhaustMap(e => {
    return new Observable.from(this.getCount())
   })
  }
 },
 methods: {
  getCount() {
   return new Promise((resolve, reject) => {
    this.count ++;
    setTimeout(() => {
     resolve(this.count);
    }, 1000);
   })
  }
 }
};

七、事件中传递参数

1、html页面

<ul>
 <li v-for="(num, index) in numList" :key="index" v-stream:click="{
  subject: getNum$,
  data: {
   'index': index,
   'num': num
  }
 }">{{ num }}</li>
</ul>
<p>点击的数字为:{{ num$.index }}</p>
<p>点击的数字下标为:{{ num$.num }}</p>

2、在vue中处理

import { Observable } from 'rxjs'
export default {
 data () {
  return {
   numList: [1, 2, 3]
  }
 },
 // v-stream事件可以统一写在这里,具体可以看vue-rx的使用
 domStreams: [
  'getNum$'
 ],
 subscriptions () {
  return {
   num$: this.getNum$
    // 从传入的对象中获取key为data的value,传入下一个operator
    .pluck('data')
    .map(data => data)
    // 因为视图引用了num$.index,所以这里要初始化num$为对象,避免报错
    .startWith({})
  }
 }
}

3、输入框中获取值

<input type="text" v-stream:keyup="getInput$">
<p>value$: {{ value$ }}</p>
import { Observable } from 'rxjs';
export default {
 domStreams: ['getInput$'],
 subscriptions () {
  return {
   value$: this.getInput$
    // 选取e.event.target.value
    .pluck('event', 'target', 'value')
    .debounceTime(2000)
    // 根据value值作比较,如果和上一次一样则不发出值
    .distinctUntilChanged()
    .map(val => {
     console.log(val);
     return val;
    })
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 立即调用的函数表达式如何写
Jan 12 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
Bootstrap Fileinput文件上传组件用法详解
May 10 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
解析利用javascript如何判断一个数为素数
Dec 08 Javascript
vue2.0父子组件间通信的实现方法
Apr 19 Javascript
原生js封装运动框架的示例讲解
Oct 01 Javascript
vue中axios的封装问题(简易版拦截,get,post)
Jun 15 Javascript
Vue2.x通用编辑组件的封装及应用详解
May 28 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
May 29 Javascript
three.js 制作动态二维码的示例代码
Jul 31 Javascript
vue实现图书管理系统
Dec 29 Vue.js
基于Vue 服务端Cookies删除的问题
Sep 21 #Javascript
Vue中插入HTML代码的方法
Sep 21 #Javascript
node.js调用C++函数的方法示例
Sep 21 #Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 #Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 #Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 #Javascript
vue中设置、获取、删除cookie的方法
Sep 21 #Javascript
You might like
PHP中array_slice函数用法实例详解
2014/11/25 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
对于Python中线程问题的简单讲解
2015/04/03 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
教师实习的自我鉴定
2013/10/26 职场文书
新闻学毕业生自荐信
2013/11/15 职场文书
工业自动化专业毕业生推荐信
2013/11/18 职场文书
会计系中文个人求职信
2013/12/24 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
保护环境建议书300字
2014/05/13 职场文书
质量安全标语
2014/06/07 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
python blinker 信号库
2022/05/04 Python