@vueent/core

Vueent core library

Usage no npm install needed!

<script type="module">
  import vueentCore from 'https://cdn.skypack.dev/@vueent/core';
</script>

README

@vueent/core

A small library (part of VueenT) that integrates controllers and services patterns to the application. The package provides three main elements: a Vueent instance, abstract Controller and Service classes.

Installation

npm install -D @vueent/core

This library has Vue 3 or Vue composition API plugin for Vue 2 peer dependency, it means that your have to add this dependencies into your project (package.json) manually.

Usage

You may create a Vueent instance directly using useVueent() call, but it's not necessary, it will be created automatically after the first useController() or useService() call. onBeforeMount, onBeforeUnmount, and onUnmounted hooks are automatically connected to init, reset, destroy methods of Controller.

Let's write a simple example:

<!-- file: app.vue -->
<!-- section: template -->
<div>
  <div>Started at: {{ timestamp }}</div>
  <div>Button clicks: {{ counter }}</div>
  <div>
    <button type="button" @click="increment">Increment</button>
  </div>
</div>
// file: app.vue
// section: script
import { defineComponent, computed } from 'vue';
import { useController } from '@vueent/core';

import AppController from './app';

function setup() {
  const controller = useController(AppController, new Date().getTime()); // creating a controller instance with parameters.

  const increment = () => controller.increment();
  const counter = computed(() => controller.counter);

  return {
    timestamp: controller.date, // non-reactive value
    counter,
    increment
  };
}

export default defineComponent({ setup });
// file: app.ts
import { Controller, registerController, injectService as service } from '@vueent/core';

import ClickerService from '@/services/clicker';

export default class AppController extends Controller {
  @service(ClickerService) private readonly clicker!: ClickerService; // lazy service injection

  public readonly date: number;

  public get counter() {
    return this.clicker.counter;
  }

  constructor(date: number) {
    super();
    this.date = date;
  }

  public init() {
    console.log('onBeforeMount');
  }

  public reset() {
    console.log('onBeforeUnmount');
  }

  public destroy() {
    console.log('onUnmounted'); // stop watchers, timers, etc.
  }

  public increment() {
    this.clicker.increment();
  }
}

registerController(AppController);
// file: services/clicker.ts
import { Service, registerService } from '@vueent/core';
import { tracked } from '@vueent/reactive'; // you may use built-in Vue's `ref`

export default class ClickerService extends Service {
  @tracked private _counter = 0;

  public get counter() {
    return this._counter;
  }

  public increment() {
    ++this._counter;
  }
}

registerService(ClickerService);

LICENSE

MIT