当前位置: 首页 > 知识库问答 >
问题:

Vue路由器数据获取:在“beforeRouteUpdate”加载组件之前获取数据

阎德业
2023-03-14

我是新的vue-router导航后卫,所以我最近意识到我需要使用beForeRouteUpdate后卫的重用组件,例如:从/foo/1/foo/2

然而,在进入/foo/1时,我通过axios调用从数据库中提取数据,在进入/foo/2之前,我需要通过axios调用再次提取新数据。

这就是我面临的问题,其中导航后卫beForeRouteUpdate加载组件/foo/2之前,我的数据加载从axios调用,因此我得到null在我的几个变量。

如何让beForeRouteUpdate等待加载下一个组件,以便从axios调用加载所有数据?

至于我的代码,它看起来是这样的:

beforeRouteUpdate (to, from, next) {
    Vue.set(this.$store.state.user, 'get_user', null)
    this.$store.dispatch(OTHER_PROFILE_GET, to.params.id).then(resp => {
      console.log(resp);
      if(this.$store.getters.is_user_loaded) {

        next()

      } else {

        this.$store.watch((state, getters) => getters.is_user_loaded, () => 
        {
          if(this.$store.getters.is_user_loaded) {
            console.log(this.$store.state.user.get_user);
            console.log('comes here');
            next()
          }
        })
      }
    })
}, 

为了进一步解释我的代码,我在我的组件中调用了此方法,因此当我从/user/1转到/user/2时,我会发送一个Vuex操作,该操作会进行axios调用以获取新的配置文件详细信息,但在axios调用完成并以Vuex状态加载数据之前,路由更新之前的已加载下一个组件。


共有1个答案

谷彦君
2023-03-14

首先,您的操作应该执行任何状态突变,例如将user.get_user设置为null。我也不知道你为什么要添加一个手表;你的操作应该只有在完成时才会解决。举个例子

actions: {
  [OTHER_PROFILE_GET] ({ commit }, id) {
    commit('clearUserGetUser') // sets state.user.get_user to null or something
    return axios.get(`/some/other/profile/${encodeURIComponent(id)}`).then(res => {
      commit('setSomeStateData', res.data) // mutate whatever needs to be set
    })
  }
}

那你的路线守卫应该有这样的东西

beforeRouteUpdate (to, from, next) {
  this.$store.dispatch(OTHER_PROFILE_GET, to.params.id).then(next)
}      

为了防止错误试图呈现null数据,请使用getters。例如,假设你的吸气器是

getters: {
  is_user_loaded (state) {
    return !!state.user.get_user
  }
}

在组件中,可以将其映射到计算属性。。。

computed: {
  isUserLoaded () {
    return this.$store.getters.is_user_loaded // or use the mapGetters helper
  },
  user () {
    return this.$store.state.user.get_user // or use the mapState helper
  }
}

然后在模板中,使用此逻辑有条件地呈现一些数据

<div v-if="isUserLoaded">
  Hello {{user}}
</div>
<div v-else>
  Loading...
</div>

这是vue路由器指南中针对路由更新之前的所建议的方法

 类似资料:
  • 我有一个显示多条路线的组件(步骤1、步骤2、步骤3…)一个接一个。我导航并传递属性,如 路线定义为 这很有效,直到我重新加载页面/路由,因为数据丢失。所以我有点想在加载组件后从父级获取数据。 我的一个想法是使用本地存储,但这感觉不对。 我是Vue的新手,我想问一下这里的最佳实践是什么。是否像这里描述的那样使用vue路由器重新加载组件?请给我一个提示。

  • 我将Nuxt与Vue路由器和Axios一起使用。我看到Vue路由器有一个叫做导航卫士的神奇功能。 不幸的是,在下面的示例中,调用了my函数,但似乎在中调用手动方法之前退出并切换页面。 这里正确的模式是什么? 我假设我对

  • 我在导航菜单中有下拉菜单来更改区域设置。但我不知道如何获得参数。如何获取当前参数? 当前参数:slug、quiz_id、id等 navigaiton菜单刀片: 我有不同的路线。 web.php

  • 本文向大家介绍在vue组件中怎么获取到当前的路由信息?相关面试题,主要包含被问及在vue组件中怎么获取到当前的路由信息?时的应答技巧和注意事项,需要的朋友参考一下 this.$router.path 或者 this.$router 是this.$route.path吧 对,

  • 在此URL中: 我想抓,当然是在路由里面。这工作很棒: 但是我想访问任何路由之外的路径以及文件如下:

  • 我有几个路线,每个路线装载3个组件。所有管线上的两个组件都相同。当我在这些路由之间移动时,我希望传递新数据,在组件的某个初始化事件上,我希望填充该组件的数据,以便它反映在UI上。我还想重新触发正在加载的组件的引导动画。我该怎么做呢。因为现在,我不知道在组件的生命周期中,我将在哪里获取数据,并使用这些新数据重新提交组件。具体来说,在myapps/1和/newapp/I中有一个主视图组件和一个侧栏组件