DEV Community

Barış Bideratan
Barış Bideratan

Posted on

Pinia: Setup syntax ile oluşturulan depoların sıfırlanması

Pinia ile depo oluşturmanın iki yolu vardır. Function/Setup yöntemini kullanıyorsanız $reset metodunun işlevini yerine getirmediğini fark etmiş olabilirsiniz.

<script setup> import { useStore } from './useStore' const store = useStore() store.$reset // 👈 </script> 
Enter fullscreen mode Exit fullscreen mode
🍍: Store "main" is build using the setup syntax and does not implement $reset(). 
Enter fullscreen mode Exit fullscreen mode

Metodun Setup syntax ile çalışmasını sağlamak için bir Pinia eklentisi oluşturacağız ✨

Stores klasörünüz içerisinde plugins isimli bir klasör oluşturun ve içerisinde resetStore.js isimli bir dosya oluşturun.

Unutmadan projenize https://www.npmjs.com/package/lodash.clonedeep paketini eklediğinizden emin olun. lodash.clonedeep ile depo'nun başlangıç durumunu derinlemesine kopyalarız ve $reset fonksiyonunu ekleriz. Bu fonksiyon depo durumunu başlangıç değerine sıfırlar. Kopya kendisiyle ilişkili referansları kaldırmak için durumu tekrar derinlemesine kopyalamak önemlidir.

resetStore.js

import cloneDeep from 'lodash.clonedeep' export default function resetStore({ store }) { const initialState = cloneDeep(store.$state) store.$reset = () => store.$patch(cloneDeep(initialState)) } 
Enter fullscreen mode Exit fullscreen mode

Ardından main.js veya Pinia'yı başlattığınız herhangi bir yerde şunları yapın:

main.js

// ... import { resetStore } from './stores/resetStore' //... const pinia = createPinia() pinia.use(resetStore) app.use(pinia) //... 
Enter fullscreen mode Exit fullscreen mode

Örneğin ben bir projemde vitesse boilerplate kullanıyorum ve pinia src klasörü altındaki modules isimli bir klasörün içinde pinia.ts dosyası içerisinde oluşturuluyor.

src/modules/pinia.ts

import { createPinia } from 'pinia' import { type UserModule } from '~/types' ++ import storeReset from '~/store/plugins/storeReset' // Setup Pinia // https://pinia.vuejs.org/ export const install: UserModule = ({ isClient, initialState, app }) => { const pinia = createPinia() app.use(pinia) ++ pinia.use(storeReset) // Refer to // https://github.com/antfu/vite-ssg/blob/main/README.md#state-serialization // for other serialization strategies. if (isClient) pinia.state.value = (initialState.pinia) || {} else initialState.pinia = pinia.state.value } 
Enter fullscreen mode Exit fullscreen mode

bundan sonra storeName.$reset() metodu çalışacaktır.

Örnek kullanım

Kullanıcı sayfadan ayrıldığında store'u sıfırla.

~/src/pages/tonality.vue

onBeforeRouteLeave((to, from, next) => { console.log('onBeforeRouteLeave called') console.log('to: ', to) console.log('from: ', from) tonalityGuessingStore.$reset() next() }) 
Enter fullscreen mode Exit fullscreen mode

Faydalanılan kaynaklar:

Top comments (0)