BeforeRouteEnter 无法通过脚本设置在生产环境中工作

Posted

技术标签:

【中文标题】BeforeRouteEnter 无法通过脚本设置在生产环境中工作【英文标题】:BeforeRouteEnter not working in production with script setup 【发布时间】:2022-01-13 12:14:48 【问题描述】:

我在 vue-router 中使用了 beforeRouteEnter 钩子,使用 axios 从两个不同的端点加载数据。我使用promise.all() 加载数据,然后使用next() 将其传递给组件。它似乎正在开发中,但是当它托管在 vercel 上时,数据不会呈现在组件上。


import axios from "axios"
import NProgress from "nprogress"

export default 
  name: "DetailView",


beforeRouteEnter(to, from, next) 
    NProgress.start()

    const getDetails = axios.get(`api/grades/$ to.params.id /`)
    const getResults =
      axios.get(`api/results/`, 
        params: 
          'grade-id': to.params.id,
        
      )


    Promise.all([getDetails, getResults])
      .then(([details, results]) => 
        next((vm) => 
          vm.details = details.data
          vm.results = results.data
        )
      )
      .finally(NProgress.done())
  ,

我使用了<script setup>...</script> 来设置功能

import  ref  from "vue"

const details = ref()
const grades = ref()

我对 javascript 也比较陌生,并且仍然试图很好地理解 Promise 和 async/await。谢谢

【问题讨论】:

看看这个答案是否有帮助***.com/questions/66481911/… 这种方法在我不使用脚本设置时有效 【参考方案1】:

终于找到了解决问题的办法。 vue 中使用<script setup> 的组件默认关闭,通过模板refs$parent 链检索的组件的公共实例不会暴露<script setup> 中声明的任何绑定。来自 vue 文档。

我必须使用 defineExpose 编译器宏显式公开 beforeRouteEnter 导航守卫中使用的属性

defineExpose(
    
       details,
       results
    
)

【讨论】:

以上是关于BeforeRouteEnter 无法通过脚本设置在生产环境中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在设置挂钩中使用 beforeRouteEnter?

axios.all 的动态使用

组件内导航防护回调不起作用:Nuxt JS 和`beforeRouteEnter`

Vue3 - 使用 beforeRouteEnter 防止闪烁的内容

vue-router钩子beforeRouteEnter函数获取到this实例

如何使用“@vue/test-utils”测试 VueRouter 的 beforeRouteEnter?