1.2.0 • Published 2 years ago

@codingruo/pinia-store-base-class v1.2.0

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

Pinia Store TS Class

Mit der Klasse wird ein vollständiger Piniastore erstellt. Er enthält, states, getters und actions.

Im folgenden Code sieht man den Aufruf bzw weitervererbung der Klasse. Durch die generischen Types werden auch zukünftige Types weiterverbt und sind durch den Linter dann auch zugänglich.

import { BaseStore } from '@codingruo/pinia-store-base-class';

export type State = {
    _data: any[],
    _active: boolean
}

export type Getters<T extends State> = {
    data: (state: T) => T["_data"]
}

export type Actions = {
    test: () => void
}

export class Factory extends BaseStore<State, Getters<State>, Actions> {
    constructor() {
        super();

        this.baseProperty<State>("state", {
            _data: [],
            _active: false
        })

        this.baseProperty("getter", {
            data: (state: State) => state._data
        })

        this.baseProperty("action", {
            test(){
                console.log('Klasse')
            }
        })
    }

    overrideAction(): Actions {
        return {
            ...super.overrideAction(),
            test: function (options: { logic?: (instance: any) => void } = {}) {

                const result = {id: 1, name: "test"}

                if (options.logic){
                    options.logic.call(this, result)
                }

                console.log('Klasse Override');
            }
        }
    }
}

Die Funktion baseProperty kann 1 der 3 Types entgegennehmen. "state", "getter", "action". Diese Funktion sollte Grundsätzlich dann aufgerufen werden denn alles Stores sich gewisse Daten teilen sollen.

Um eine Funktion vollständig zu überschreiben und eine CustomLogic einzufügen, wird die overrideAction funktion in der Klasse aufgerufen. Dies ermöglicht ein Erzeugen eigener Bedingungen im Store.

Folgender Code zeigt die Instanziierung der Klasse und überschreiben des test Funktion.

import { Factory } from "@/stores/Factory";

export function useCounterStore() {
  const factory = new Factory()

  factory.addStoreProperty("state", {
    _active: false,
  })

  factory.addStoreProperty("getter", {
    active: (state: any) => state._active
  })

  factory.addStoreProperty("action", {
    test(){
      // @ts-ignore
      return factory.overrideAction().test.call(this, {
        logic: function (result: any) {
          if(result){
            // @ts-ignore
            this._data = [result]
          }
        }
      })
    }
  })

  return factory.generateStore()
}

Und am Ende natürlich dann in der Vue Datei auch die Funktion nutzen.

import {useCounterStore} from "@/stores/counter";
import {storeToRefs} from "pinia";

const counterStore = useCounterStore()
const { data } = storeToRefs(counterStore)

counterStore.test()
1.2.0

2 years ago

1.1.1

2 years ago

1.0.2

2 years ago

1.0.3

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago

0.1.6

2 years ago

0.1.4

2 years ago

0.1.3

2 years ago

0.1.2

2 years ago

0.1.0

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago