vue-sub

Simple observer pattern implementation for VueJS
924 2
Install
npm install vue-sub
Latest Version:1.1.1
Vue:2
License:MIT
Last Updated:Aug 22, 2019
Links: GitHub  ·  npm
Maintainer: eazymov

@Eazymov/vue-sub

npm License Build Status

Simple observer pattern implementation for VueJS

Dependencies

Installation

Direct <script /> include:

Include VueSub after vue. Plugin will be installed automatically.

<script src="link/to/vue"></script>
<script src="https://cdn.jsdelivr.net/gh/eazymov/vue-sub@latest/dist/vue-sub.min.js"></script>

NPM

npm install vue-sub --save

Yarn

yarn add vue-sub

When used with a module system, you must explicitly install VueSub via Vue.use():

import Vue from 'vue';
import VueSub from 'vue-sub';

Vue.use(VueSub);

You don't need to do this when using global script tags.

Usage

Creating the observable

import Vue from 'vue';
import VueSub from 'vue-sub';

Vue.use(VueSub);

const observable = new VueSub();

const app = new Vue({
  observable,
});

You can create VueSub instance with existing observers

const observable = new VueSub({
  observers: {
    'log': [
      console.log,
      anotherLogHandler,
    ],
    'error': [
      console.error,
      anotherErrorHandler,
    ],
  },
});

Using inside the component

const componentA = {
  mounted () {
    this.$observable.subscribe(actionType, handler);
  }
}

const componentB = {
  handleClick () {
    this.$observable.fire(actionType);
  }
}

To unsubscribe from an event use $observable.unsubscribe

const component = {
  mounted () {
    this.$observable.subscribe(actionType, handler);
    this.$observable.unsubscribe(actionType, handler);
    this.$observable.fire(actionType); // won't work
  }
}

If you want to react to an event only once, you can use $observable.once

const component = {
  mounted () {
    this.$observable.once(actionType, handler);
    this.$observable.fire(actionType); // fires only once
  }
}

When using class components and typescript

import Vue from 'vue';
import { Action, Subscribe, Once } from 'vue-sub';

@Component
export class MyComponent extends Vue {
  @Action('foo')
  public actionFoo: (params: Params) => void;
  
  @Subscribe('bar')
  public handler (): void {
    // Fires every time 'bar' emits
  }
  
  @Once('bar')
  public anotherHandler (): void {
    // Fires only once
  }

  public created (): void {
    this.actionFoo(params); // -> $observable.fire('foo', params);
  }
}

Questions

If you have any troubles or questions you can create the issue or text me on email any time

License

MIT

Copyright (c) 2017 - present, Eduard Troshin

Related Packages

vueinview

vue in-view

23,014 99
vue-resize-observer

Vue普通元素resize事件监听

148,954 63
v-track

一个基于Vue指令的埋点插件

4,681 341
vue-chill

Chill down Vue.js data watchers

3,559 3
vue-i18n-extract

Manage vue-i18n localization with static analysis

4,497,845 364

Version History

Version Released Vue License
1.1.1 ^2.5.3 MIT
1.1.0 ^2.5.3 MIT
1.0.0 MIT
0.0.8 MIT
0.0.7 MIT