百科狗-知识改变命运!
--

数据获取 - created() 钩子内 watch(),beforeRouteEnter()、beforeRouteUpdate() 守卫 - vue router(路由)

梵高1年前 (2023-11-21)阅读数 15#技术干货
文章标签数据

数据获取

数据获取 - created() 钩子内 watch(),beforeRouteEnter()、beforeRouteUpdate() 守卫 - vue router(路由)

有时候,进入某个路由后,需要从服务器获取数据。例如,在渲染用户信息时,你需要从服务器获取用户的数据。我们可以通过两种方式来实现:

  • 导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的指示。
  • 导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。

从技术角度讲,两种方式都不错——就看你想要的用户体验是哪种。


导航完成后获取数据

当你使用这种方式时,我们会马上导航和渲染组件,然后在组件的created()钩子中获取数据。这让我们有机会在数据获取期间展示一个 loading 状态,还可以在不同视图间展示不同的 loading 状态。

假设我们有一个Post组件,需要基于$route.params.id获取文章数据:

 
Loading...
{{ error }}

{{ post.title }}

{{ post.body }}

export default {
  data() {
    return {
      loading: false,
      post: null,
      error: null,
    }
  }, created() {
    // watch 路由的参数,以便再次获取数据
    this.$watch(
      () => $route.params.id,
      () => {
        this.fetchData()
      },
      // 组件创建完后获取数据,
      // 此时 data 已经被 observed 了
      { immediate: true }
    )
  },
  methods: {
    fetchData() {
      this.error = this.post = null
      this.loading = true
      // replace `getPost` with your data fetching util / API wrapper
      // 用你的数据获取 util 或 API 替换 `getPost`
      getPost(this.$route.params.id, (err, post) => {
        this.loading = false
        if (err) {
          this.error = err.toString()
        } else {
          this.post = post
        }
      })
    },
  },
}


新路由导航完成后,才更新 DOM,才运行组件的生命周期钩子。所以除去生命周期create()钩子外,还可以使用:beforMount()、mounted()。在组合式API中,使用onBeforMount()、onMounted()。

相同路由导航,即带有参数的路由。当参数变化的时候,相同的组件实例会被重复使用,所以组件的生命周期钩子会被调用。



在导航完成前获取数据

通过这种方式,我们在导航转入新的路由前获取数据。我们可以在接下来的组件的beforeRouteEnter()守卫中获取数据,当数据获取成功后只调用next方法。

export default {
  data() {
    return {
      post: null,
      error: null,
    }
  }, beforeRouteEnter(to, from, next) {
    getPost(to.params.id, (err, post) => {
      next(vm => vm.setData(err, post))
    })
  },
  // 路由改变前,组件就已经渲染完了
  // 逻辑稍稍不同
  async beforeRouteUpdate(to, from) {
    this.post = null
    try {
      this.post = await getPost(to.params.id)
    } catch (error) {
      this.error = error.toString()
    }
  },
}

在为后面的视图获取数据时,用户会停留在当前的界面,因此建议在数据获取期间,显示一些进度条或者别的指示。如果数据获取失败,同样有必要展示一些全局的错误提醒。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)