Интеграция RxJS v6+ в Vue.js.
Относительно несовместимых изменений в версии 5.0:
- vue-rx v6 теперь по умолчанию работает только с RxJS V6+. Если вы хотите продолжить использовать код в стиле RxJS v5, установите
rxjs-compat
.
rxjs
необходимо импортировать как peer dependency.
npm install vue vue-rx rxjs --save
import Vue from 'vue';
import VueRx from 'vue-rx';
Vue.use(VueRx);
webpack по умолчанию будет использовать dist/vue-rx.esm.js
. Это позволяет импортировать минимальное количество операторов Rx и обеспечивает минимальный размер пакета.
Если вы хотите использовать его в браузере, вам нужно импортировать UMD сборку dist/vue-rx.js
. В среде браузера UMD сборка предполагает, что window.rxjs
уже существует, поэтому вам необходимо убедиться, что вы импортируете vue-rx.js
после Vue.js и RxJS. Если window.Vue
существует, vue-rx
установится автоматически.
Пример:
<script src="https://unpkg.com/rxjs/bundles/rxjs.umd.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="../dist/vue-rx.js"></script>
// Предоставьте Rx observables через опцию subscriptions
new Vue({
el: '#app',
subscriptions: {
msg: messageObservable
}
});
<!-- Привязать к шаблону -->
<div>{{ msg }}</div>
Опция subscriptions
также может принимать функцию, чтобы можно было возвращать уникальные наблюдаемые объекты для каждого экземпляра компонента:
import { Observable } from 'rxjs'
Vue.component('foo', {
subscriptions: function () {
return {
msg: new Observable(...)
}
}
})
Наблюдаемые будут доступны через vm.$observables
:
const vm = new Vue({
subscriptions: {
msg: messageObservable
}
});
vm.$observables.msg.subscribe(msg => console.log(msg));
v-stream
: потоковые события DOMvue-rx
предоставляет v-stream
, который позволяет отправлять события DOM в поток Rx. Синтаксис похож на v-on
, где параметр директивы соответствует имени события, а значение привязки соответствует Rx Subject.
<button v-stream:click="plus$">+</button>
Перед рендерингом вам необходимо объявить экземпляр Rx.Subject
— plus$
на экземпляре vm, как если бы вы объявляли данные. Вы также можете сделать это в функции subscriptions
.
import { Subject } from 'rxjs';
import { map, startWith, scan } from 'rxjs/operators';
new Vue({
subscriptions() {
// Объявить принимающие Subjects
this.plus$ = new Subject();
// ...затем использовать Subjects в качестве источника потока для создания подписки.
// Источник потока отправляет данные в формате `{ event: HTMLEvent, data?: any }`
return {
count: this.plus$.pipe(
map(() => 1),
startWith(0),
scan((total, change) => total + change)
)
};
}
});
Или используйте опцию domStreams
для краткости:
new Vue({
// Необходимо передать Rx в Vue.use(), чтобы раскрыть Subject
domStreams: ['plus$'],
subscriptions() {
// Используйте this.plus$
}
});
Наконец, используйте другой синтаксис для передачи дополнительных данных в поток:
<button v-stream:click="{ subject: plus$, data: someData }">+</button>
Это очень полезно, когда вам нужно передать временные переменные шаблона, такие как v-for
, вместе с потоком. Вы можете напрямую извлекать нужные данные из исходного потока.
const plusData$ = this.plus$.pipe(pluck('data'));
Начиная с версии 3.1, вы можете передавать дополнительные параметры (как третий параметр, переданный вместе с собственным addEventListener
):
<button v-stream:click="{
subject: plus$,
data: someData,
options: { once: true, passive: true, capture: true }
}">+</button>
Для более подробного использования см. пример.
v-stream
: Потоковая передача пользовательских событий от дочерних компонентовПодобно потоковым событиям DOM, v-stream
также можно использовать для компонентов, создавая наблюдаемые на основе пользовательских событий, запускаемых дочерними компонентами. Он работает аналогично v-on
:
<div>
<!-- Пользовательский компонент -->
<pagination v-on:change="pageChanged()"></pagination>
<!-- Использовать v-stream на пользовательском компоненте -->
<pagination v-stream:change="pageChange$"></pagination>
</div>
$watchAsObservable(expOrFn, [options])
Этот метод является методом экземпляра, добавленным в прототип. Вы можете создать observable на основе значения наблюдателя. Значение будет срабатывать в формате { newValue, oldValue }
:
import { pluck, map } from 'rxjs/operators';
const vm = new Vue({
data: {
a: 1
},
subscriptions() {
// Использовать операторы Rx для декларативного сопоставления с другим свойством
return {
aPlusOne: this.$watchAsObservable('a').pipe(
pluck('newValue'),
map(a => a + 1)
)
};
}
});
// Или вызвать побочный эффект...
vm.$watchAsObservable('a').subscribe(
({ newValue, oldValue }) => console.log('поток значений', newValue, oldValue),
err => console.error(err),
() => console.log('завершено')
);
Необязательный объект options
принимает те же параметры, что и vm.$watch
.
$eventToObservable(event)
Преобразует vue.$on
(включая события жизненного цикла) в Observables. Значение будет срабатывать в формате { name, msg }
:
import { interval } from 'rxjs';
import { take, takeUntil } from 'rxjs/operators';
const vm = new
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )