npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

nuxt-mvvm

v1.0.21

Published

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

Downloads

30

Readme

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

Features

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

Setup

Add as dependency

pnpm add nuxt-mvvm && pnpm add tsyringe -D
import {defineNuxtConfig} from 'nuxt'


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

Usage

1. Simple usage

Create view-model

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

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

And just use it


<template>
	<button @click="vm.increment()">
		count: {{vm.counter}}
	</button>
</template>

<script setup lang="ts">
	import {useVm} from '#imports';


	const vm = useVm(MyViewModel);
</script>

2. Usage with services

Create service

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

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

Inject service

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

Use it with service


<template>
	<button @click="vm.counter.increment()">
		count: {{ vm.counter.value }}
	</button>
</template>

<script setup lang="ts">
	import {useVm} from '#imports';


	const vm = useVm(MyViewModel);
</script>

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.

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

@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

/**
 * 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();
    }
}