suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Verwenden Sie die Vue 3 Composition API und verwenden Sie Router() im onMounted-Hook

Ich möchte useRoute in meiner Komponente verwenden, die im onMounted-Hook aufgerufen wird. Etwas Ähnliches

import { checkUserAuth } from '@/common/CheckUserAuth'

onMounted(async () => {
  await checkUserAuth()
})

CheckUserAuth.ts ist:

import { useRouter } from 'vue-router'

const router = useRouter() // here router is undefined

export const checkUserAuth = async () => {
  const userStore = useUserStore()
  const userApi = new UserApi()
  const token = localStorage.getItem(TOKEN_NAME)

  const router = useRouter() // and here too router is undefined

  if (!token) {
    await router.push({ name: LOGIN_PAGE_ROUTE })

    return
  }

  const userData = await userApi.fetchMasterInfo()
  userStore.setUser(userData)
  await router.push({ name: DASHBOARD_ROUTE })
}

Ich verstehe nicht, warum der Router überall undefiniert wird. Gibt es eine Möglichkeit, das zu beheben, ohne den Router als Parameter zu übergeben? (Ich möchte die checkUserAuth-Funktion vollständig kapseln)

Ich weiß, dass ich es reparieren kann

const router = useRouter()

onMounted(async () => {
  await checkUserAuth(router)
})

export const checkUserAuth = async (router: Router) => {
  await router.push({ name: DASHBOARD_ROUTE })
}

Aber das ist keine gute Lösung

P粉529581199P粉529581199378 Tage vor794

Antworte allen(2)Ich werde antworten

  • P粉469090753

    P粉4690907532023-11-24 09:39:16

    useRouter的API必须在setup中调用,官方文档中有提到。你可以在https://router.vuejs.org/zh/api/#userouter(zh文档提到过)中看到这一点。 也许你可以编写这样的代码:

    import { useRouter } from 'vue-router'
    
    export const useCheckUserAuth = () => {
      const userStore = useUserStore()
      const router = useRouter()
    
      returnv aysnc function checkUserAuth() {
        const userApi = new UserApi()
        const token = localStorage.getItem(TOKEN_NAME)
        if (!token) {
          await router.push({ name: LOGIN_PAGE_ROUTE })
      
          return
        }
      
        const userData = await userApi.fetchMasterInfo()
        userStore.setUser(userData)
        await router.push({ name: DASHBOARD_ROUTE })
      }
    }

    并在设置中调用它:

    const checkUserAuth = useCheckUserAuth()
    
    onMounted(() => {
      checkUserAuth()
    })

    希望对您有帮助。

    Antwort
    0
  • P粉848442185

    P粉8484421852023-11-24 00:28:49

    可组合项应该在设置中直接使用,除非它们的实现允许其他用途,否则需要根据每种情况确定。

    由于 checkUserAuth 使用可组合项,这使其成为可组合项,如果需要在已安装的挂钩中使用它,则需要返回一个允许这样做的函数:

    const useUserAuth = () => {
      const router = useRouter()
      const userStore = useUserStore()
      const userApi = new UserApi()
    
      return {
        async check() {...}
      }
    }

    或者,checkUserAuth 不应使用可组合项。 useUserStore 没有可组合项固有的限制,并且 useRouter 可以替换为路由器实例的导入。

    Antwort
    0
  • StornierenAntwort