Skip to content

Реактивные модели в расширении (defineStore)

Внутри расширения удобно выносить состояние и логику из компонентов в небольшие сторы. В @rynt/sdk для этого экспортируется defineStore из @rynt/sdk/extension (тот же импорт, что и для defineRyntExtension).

Идея

defineStore принимает фабрику () => { … refs, computeds, methods } и возвращает функцию без аргументов, которая при каждом вызове отдаёт один и тот же экземпляр (singleton по умолчанию). Паттерн похож на «комposable с общим состоянием на всё расширение».

Пример

ts
import { computed, ref } from 'vue';
import { defineStore } from '@rynt/sdk/extension';

const useHelloStore = defineStore(() => {
  const clicks = ref(0);
  const label = computed(() => `Нажато: ${clicks.value}`);
  function increment() {
    clicks.value += 1;
  }
  return { clicks, label, increment };
});

export { useHelloStore };

В компоненте:

ts
const hello = useHelloStore();
hello.increment();

Когда не singleton

Второй аргумент defineStore(fn, false) отключает singleton: функция начинает вести себя как фабрика с аргументами (редко нужно в расширениях).

Связь с useModel

  • useModel('…')данные и сервисы лаунчера, которые хост уже зарегистрировал (см. модели).
  • defineStoreваше локальное состояние внутри пакета расширения.

См. также