pinia-class

pinia typescript decorators
16,906 8
Install
npm install pinia-class
Latest Version:0.0.6
Vue:3
Older releases:2
License:MIT
Last Updated:Jul 28, 2023
Links: GitHub  ·  npm
Maintainer: jqgl

Pinia Class

Porting Vuex-Class to Pinia 🍍 !

Installation

tl;dr;

$ npm i --save pinia-class pinia vue-facing-decorator
$ npm install --save pinia-class

Quite naturally, pinia and vue-facing-decorator are peer dependencies of this package:

$ npm i --save vue-facing-decorator pinia

And initialize your project with

// main.ts
import { createApp } from 'vue';
import { createPinia } from 'pinia';

import App from './App.vue';

creatApp(App)
  .use(createPinia())
  .moun('#app');

Links:

Usage

See the examples project.

You should be able to use pinia-class, quite similarly to vuex-class

import { Component, Vue } from 'vue-facing-decorator'
import { Action, Getter, Store, State } from 'pinia-class'
import { useStore } from './store/myStore'

@Component
export default class MyComponent extends Vue {
  @Action(useStore, 'myAction')
  myActionName // rename the action locally

  @Action(useStore)
  myAction // or directly use the name of the action / getter / state for the class attribute

  @Getter(useStore, 'myGetter')
  getter

  @Getter(useStore)
  myGetter

  @State(useStore, 'fruits')
  allTheFruits

  @State(useStore)
  fruits

  @Store(useStore)
  store // directly inject the store as attribute
}

WritableState

pinia-class also introduces a new concept of WritableState. Contrary to vuex, pinia allows to write directly into the store's state. Hence, it becomes possible to directly expose the state as a reactive object. To do that you can can use the @WritableState decorator:

<template>
  <ul><li v-for="fruit of fruits" :key="fruit">{{ fruit }}</li></ul>

  <!-- Here we mutate the store globally -->
  <button @click.stop="fruits = []">Clear</button>

</template>

<script lang="ts">
import { Component, Vue } from 'vue-facing-decorator';
import { defineStore } from 'pinia';

const useBasket = defineStore({ state: () => ({ fruits: [] as string[] }) });

@Component
export class MyComponent extends Vue {
  // no readonly here
  @WritableState(useBasket, ['fruits'])
  fruits!: string[];
}
</script>

Related Packages

@dullar/mercury

Advanced and highly reusable Mobile UI Components built on Vue2 & You can define...

8,553 6
@halobear/vue-upload

vue上传组件

460 1
vite-plugin-vue2

Vite plugin for Vue2

1,474,659 618
vue-jstree

a tree plugin for vue2

137,015 630
vite-plugin-git-revision

Vite plugin that generates VERSION and COMMITHASH files during build based on a...

21,961 11

Version History

Version Released License
0.0.6 MIT
0.0.5 MIT
0.0.4 MIT
0.0.3 MIT
0.0.2 MIT