Maison > interface Web > Voir.js > Ce qui suit est une réécriture des « pièges du pinia vue3 et d'un exemple d'analyse de code » : 'Analyse de vue3 pinia, y compris les pièges et les solutions, combinée avec un exemple de code pour l'analyse.'

Ce qui suit est une réécriture des « pièges du pinia vue3 et d'un exemple d'analyse de code » : 'Analyse de vue3 pinia, y compris les pièges et les solutions, combinée avec un exemple de code pour l'analyse.'

WBOY
Libérer: 2023-05-10 08:37:09
avant
1930 Les gens l'ont consulté

Installation

yarn add pinia # or npm install pinia
Copier après la connexion

Utilisation

// user.ts
import { defineStore } from 'pinia'
export const useUserStore = defineStore({
  id: 'user',
  state: () => ({
    ...
  }),
  actions: {
    ...
  }
})
// components.vue
import { useUserStore } from '@/store/user'
const userStore = useUserStore()
Copier après la connexion

Problèmes lors de l'utilisation

Impossible d'accéder à 'useUserStore' avant l'initialisation

Étapes de reproduction

Habituellement, nous déterminerons si l'utilisateur est connecté au hook de routage pour déterminer les autorisations. Par exemple :

// permission.ts
import { NavigationGuardNext, RouteLocationNormalized } from 'vue-router'
import router from './router'
import { useUserStore } from './store/user'
const userStore: any = useUserStore()
router.beforeEach(async(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
  // TODO 判断是否登录
  if (userStore.name) {
    ...
  }
})
// main.ts
const app = createApp(App)
app.use(createPinia())
import router from './router'
import '@/permission'
app.use(router)
app.mount('#app')
Copier après la connexion

Cause du problème

Lorsque le code est exécuté de haut en bas, lors de la rencontre de const userStore: any = useUserStore(), le module de statut utilisateur sera obtenu, mais l'application n'a pas encore été montée, donc le statut global de Pinia n'a pas été initialisé. En conséquence, lors de l'initialisation de l'acquisition de l'état du module utilisateur, l'état global n'est pas initialisé, provoquant ainsi le problème actuel.

Solution

Lorsque la fonction de hook de routage obtient le module d'état utilisateur et appelle le hook de routage, cela signifie que l'état global a été entièrement initialisé. Mais cela entraînera l'obtention du module de statut utilisateur à chaque appel du hook de routage, ce qui entraînera un gaspillage de ressources (bien sûr, cela peut atteindre l'objectif attendu, mais ce n'est pas ce dont nous avons besoin). Nous pouvons déclarer une variable dans la couche externe pour stocker l'état et porter un jugement dans le hook de routage. Si la variable actuelle est vide, cela signifie que l'état n'a pas encore été obtenu et que l'état est obtenu dans la situation actuelle ( semblable à un singleton). Code final :

// permission.ts
import { NavigationGuardNext, RouteLocationNormalized } from 'vue-router'
import router from './router'
import { useUserStore } from './store/user'
let userStore: any = null
router.beforeEach(async(to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {
  if (userStore === null) {
    userStore = useUserStore()
  } 
  // TODO 判断是否登录
  if (userStore.name) {
    ...
  }
})
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal