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

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

益清野
2023-03-14

我正在使用Vue路由器和基于文件的组件。我打电话给其中一条路线casetail。vue并获取一个参数(slug),该参数使用axios从API获取json

我使用“组件内保护”来实现这一点,使用名为beforeRouteEnter的方法。我正在将axios的响应传递到下一个方法。

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

这是可行的,但是,Vue在设置数据之前呈现视图。这将生成未定义的错误。我如何告诉Vue等待它获取数据?

我的模板:

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

我的组成部分:

export default{

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

...

共有1个答案

范瀚昂
2023-03-14

处理步骤:

  1. axios api正在调用
  2. 组件已创建
  3. 调用路由之前的中的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>

 类似资料:
  • 我是reactjs新手,我想在服务器中获取数据,以便它将包含数据的页面发送给客户端。 当函数getDefaultProps返回像这样的虚拟数据时是可以的{data:{book:[{...},{...}]}}。 但是不适用于下面的代码。代码按此顺序执行,并带有错误消息“无法读取未定义的属性'book'” getDefaultProps 返回 取 {data:{book:[{...},{...}]}}

  • 我试图在呈现组件之前从API加载事件。目前我正在使用我的API服务,我从组件的ngOnInit函数调用该服务。 我的组件: 我的模板 我的API服务 组件在函数中的API调用完成获取数据之前呈现。所以我从来没有看到我的视图模板中的事件ID。所以看起来这是一个ASYNC问题。我期望在设置了属性后,绑定(组件)来完成一些工作。可悲的是,当属性被设置时,它不显示用标记的。 问:我用的方法好吗?如果没有;

  • 我使用了fetch方法向后端发送了一个请求,获取到了返回数据之后 ,该数据是一个对象类型的,我如何批量创建li到该ul中呢?li中要对应对象的属性 后端数据格式

  • 接口说明 获取之前设置的数据的权限 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/power/1.0.0/getJson 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 dataGuid string form 是 素材id 响应字段说明 无 响应成功示例 { "code": 200, "d

  • 问题内容: 我有一个react组件,需要 在渲染之前 预先知道其尺寸 。 当我在jquery中制作一个小部件时,我可以在构建组件时提前获取容器的宽度。 这些容器的尺寸以及页面上的其他许多容器都在CSS中定义。谁在React中定义组件的高度,宽度和位置?我已经习惯了CSS并能够访问它。但是在React中,似乎我只能在组件渲染后访问该信息。 问题答案: 如前所述,在将元素呈现为DOM之前,您无法获得任

  • 问题内容: 如何在 呈现字符串之前获取字符串将占用的行数。 将不起作用,因为它们仅在呈现后才被触发。 问题答案: final Rect bounds = new Rect(); final Paint paint = new Paint(); paint.setTextSize(currentTextSize); paint.getTextBounds(testString, 0, testStr