Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/fidden/nuxt-mvvm

Intuitive, type safe and flexible MVVM implementation for nuxt based applications
https://github.com/fidden/nuxt-mvvm

dependency-injection di mvvm mvvm-architecture nuxt oop solid vue

Last synced: 3 months ago
JSON representation

Intuitive, type safe and flexible MVVM implementation for nuxt based applications

Awesome Lists containing this project

README

        

nuxt-mvvm

⚡️ MVVM implementation for nuxt applications

> Intuitive, type safe and flexible MVVM implementation for nuxt based applications

## Features

- ⛰️ Nuxt3 ready
- ⚙️ SSR support
- 💉 Dependency injection
- 📦 Extremely light

## Setup

Add as dependency

```shell
pnpm add nuxt-mvvm && pnpm add tsyringe -D
```

```ts
import {defineNuxtConfig} from 'nuxt'

export default defineNuxtConfig({
modules: ['nuxt-mvvm']
})
```

## Usage

### 1. Simple usage

Create view-model

```ts
@ViewModel()
class MyViewModel extends BaseViewModel {
constructor() {
super();
this.counter = 0;
}

public increment() {
this.counter++;
}
}
```

And just use it

```vue


count: {{vm.counter}}

import {useVm} from '#imports';

const vm = useVm(MyViewModel);

```

### 2. Usage with services

Create service

```ts
class CounterService {
constructor() {
this.value = 0;
}

public increment() {
this.value++;
}
}
```

Inject service

```ts
@ViewModel()
class MyViewModel extends BaseViewModel {
constructor(
@injectDep(CounterService) public readonly counter: CounterService
) {
super();
}
}
```

Use it with service

```vue


count: {{ vm.counter.value }}

import {useVm} from '#imports';

const vm = useVm(MyViewModel);

```

### 3. Control lifecycle

You can specify life cycle hook via `IMountable` `ISetupable`, `IUnmountable` interfaces or just use union
interface `ILifeCycle` that contains all possible life cycle hooks.

```ts
@ViewModel()
class MyViewModel extends BaseViewModel implements IMountable, ISetupable, IUnmountable /* or implements ILifeCycle */ {
constructor() {
super();
}

public onMount() {
// calls on view mounting
}

public onSetup() {
// calls on view setup
}

public onUnmount() {
// calls on view unmounting
}
}
```

### 4. Routing
The `BaseViewModel` encompasses `router` and `route` variables, which are equivalents of `useRouter` and `useRoute`.
```ts
@ViewModel()
class MyViewModel extends BaseViewModel {
constructor() {
super();
}

public redirect() {
this.router.push('/');
}

public get currentRouteFullPath() {
return this.route.fullPath;
}
}
```

Life cycle interfaces:

- `IMountable`
- `IBeforeMountable`
- `ISetupable`
- `IUnmountable`
- `IBeforeUnmountable`
- `ICaptureError`
- `IUpdatable`
- `IRenderTrackable`
- `IRenderTriggerable`
- `IDeactivatable`
- `IActivatable`
- `IServicePrefetchable`

Router interfaces:

- `IRouterable`

### Decorators

1. `ViewModel` - Labels a class as a view-model. Apply this decorator when the class represent a screen or a component.
2. `injectDep` - Injects a dependency into a view-model.
3. ~~`ScreenVm` - Signifies that the class is a screen view-model.~~ (deprecated)
4. ~~`ComponentVm` - Identifies a class as a component view-model.~~ (deprecated)

### Reusable Composition Functions

1. `useVm` - Function to generate view-model instance
2. `useChildVm` - Function to utilize an instance of previously created view-model

### Establishment of a base view-model

```ts
/**
* Every view-model must inherit from the BaseViewModel class and be decorated with the @ViewModel, or @ScreenVm, or @ComponentVm decorator.
*/
@ViewModel()
class ViewModel extends BaseViewModel {
constructor() {
super();
}
}
```