Übergeben Sie Pinia Store als Requisite mit Vue3 und TypeScript
<p>Ich verwende Typescript, Pinia und Vue3 und habe eine <code>MenuButton</code>-Komponente und möchte in der Lage sein, den Pinia-Speicher/Ausblenden für den Menü-Öffnungszustand und die anzuzeigende Aktion zu übergeben . Es gibt einige verschiedene Menüs in der Anwendung, daher möchte ich sie übergeben können und alle dieselbe Factory verwenden, um den Shop zu definieren. Ich versuche herauszufinden, wie ich das alles mit Typoskript zum Laufen bringen kann. </p>
<pre class="lang-js Prettyprint-override"><code>// nav.store.ts
import { defineStore } from "pinia";
import { useStorage } from "@vueuse/core";
Importtyp {RemovableRef} aus „@vueuse/core“;
Exportschnittstelle MenuStore {
isOpen: RemoveableRef<boolean>,
toggle(force?: boolean) : void,
open(): void,
close(): void,
}
Schnittstellenstatus {
isOpen: RemoveableRef<boolean>;
}
Funktion menuStoreFactory(id: string) {
return defineStore(id, {
state: () : State => ({
isOpen: useStorage(`${id}-open`, false),
}),
Aktionen: {
toggle(force?: boolean) {
this.isOpen = force != undefiniert ? force : !this.isOpen;
},
offen() {
this.isOpen = true;
},
schließen() {
this.isOpen = false;
}
}
});
}
export const useMainMenuStore = menuStoreFactory('mainMenu');
export const useMobileMenuStore = menuStoreFactory('mobileMenu');
</code></pre>
<pre class="lang-js Prettyprint-override"><code>// Setup-Skript für die Menüschaltflächenkomponente
import { MenuIcon, MenuLeftIcon } aus "@/icons";
Importtyp { MenuStore } aus "@/modules/nav/nav.store";
Schnittstelle Requisiten {
Controller: MenuStore
}
const props = defineProps<Props>();
</code></pre>
<p>Dann ist die Verwendung ganz einfach:</p>
<pre class="lang-html Prettyprint-override"><code><template>
<MenuButton
:controller="mainMenu"
></MenuButton>
</template>
<script setup lang=ts">
const mainMenu = useMainMenuStore();
</script>
</code></pre>
<p>In der aktuellen Schnittstelle erhalte ich eine Fehlermeldung über die Nichtübereinstimmung der Requisiten. Nach einiger Recherche habe ich die Schnittstelle wie folgt geändert, wodurch der Verwendungsfehler behoben wurde, aber dann wurde der Fehler in der Komponente <code>toggle()</code> /code> für code>isOpen< wurde nicht aufgelöst.</p>
<pre class="lang-js Prettyprint-override"><code>Exportschnittstelle MenuStore erweitert PiniaCustomStateProperties<{
isOpen: AbnehmbareRef<boolean>,
toggle(force?: boolean) : void,
open(): void,
close(): void,
}> {}
</code></pre>
<p>另一个接近的尝试调整是:</p>
<pre class="lang-js Prettyprint-override"><code>export interface MenuStore erweitert Store<string, {
isOpen: RemoveableRef<boolean>,
toggle(force?: boolean) : void,
open(): void,
close(): void,
}> {}
</code></pre>
<p>这导致了使用时出现此错误,但组件中没有错误</p>
<pre class="brush:php;toolbar:false;">Type _StoreWithState<string, State, {}, {toggle(force?: boolean): void, close(): void, open(): void} > &Ampere; UnwrapRef<State> &Ampere; _StoreWithGetters<{}> &Ampere; {toggle(force?: boolean): void, close(): void, open(): void} & PiniaCustomProperties<string, State, {}, {toggle(force?: boolean): void, close(): void, open(): void}> &Ampere; PiniaCustomStateProperties<State> kann nicht dem Typ MenuStore zugewiesen werden ... Typ PiniaCustomStateProperties<State> kann nicht dem Typ MenuStore</pre></p> zugewiesen werden.