在渲染之前将 ajax 获取的数据设置为组件

Posted

技术标签:

【中文标题】在渲染之前将 ajax 获取的数据设置为组件【英文标题】:Set ajax-fetched data to component before render 【发布时间】:2018-10-23 19:41:23 【问题描述】:

我将 Vue Router 与基于文件的组件一起使用。我调用了其中一条路由CaseDetail.vue,它获得了一个参数(slug),该参数从带有axios的API中获取一个json。

我使用“In-Component Guards”执行此操作,方法名为beforeRouteEnter。我正在将 axios 的响应传递给下一个方法。

    axios.get('/case/'+ to.params.slug +'.json').then((response) => 
      next(vm => 
        vm.entry = response.data;
      )
    );

这很有效,但是,Vue 在数据设置之前渲染视图。这会产生undefined 错误。我如何告诉 Vue 等待它获取数据?

我的模板:

<template>
  <main>
    <h1> entry.title </h1>
  </main>
</template>

我的组件:

export default

 name: 'CaseDetail',
 data()
    return         
        entry: null
    ;
 ,

...

【问题讨论】:

【参考方案1】:

处理步骤:

    axios api 正在调用 组件已创建 调用beforeRouteEnter 中的next()。那时因为组件创建了,所以vm变量是可用的。

如果你通过控制台登录你的组件

  created() 
    console.log('Component is created!')
  ,
  beforeRouteEnter(to, from, next) 
    setTimeout(() => 
      next(vm => 
        console.log('next() is called')
      )
    , 3000)
  ,

那么结果会是

组件已创建!

next() 被调用

您应该为数据设置默认值,或添加安全检查。

<template>
  <main>
    <h1> entry? entry.title: '' </h1>
  </main>
</template>

【讨论】:

谢谢!设置默认值是有意义的,但是,我希望有一种方法可以防止在组件拥有所需数据之前创建组件。我希望模板中的逻辑尽可能少。是否可以将 GET 数据传递给 beforeCreate 方法或类似方法? 通常我会在组件的created钩子中调用api。同时,我可以向用户显示加载状态。我认为这会带来更好的用户体验。如果你想使用beforeCreate ,当用户点击一个链接时,如果互联网连接或api响应很慢,用户会觉得网站挂了(用户体验不好) 我同意这是更好的用户体验,我正在寻找类似 @​​987654321@ 的示例。但是没有解释他们在示例中使用的(似乎在全局命名空间中)getPost-method 的工作原理。

以上是关于在渲染之前将 ajax 获取的数据设置为组件的主要内容,如果未能解决你的问题,请参考以下文章

React native - 在渲染应用程序组件之前从异步存储中获取数据

React 中的 AJAX 请求:获取数据的方法

React组建实现新闻下拉刷新加载

在redux返回结果之前如何处理渲染方法?

在渲染到布局之前获取文本视图的高度

ajax获取的数据,怎么存储在页面