未定义的变量 - 虽然 api fetch |爱讯 |道具

Posted

技术标签:

【中文标题】未定义的变量 - 虽然 api fetch |爱讯 |道具【英文标题】:Undefined variable - While api fetch | Axios | Props 【发布时间】:2020-01-31 21:09:46 【问题描述】:

我的主要组件 - 主页

一个非常简单的组件,我将 fetch 变量传递给另一个组件。

<template>
      <Page actionBarHidden="true">
        <ComponentA :api="api.somevariable"></ComponentA>
      </Page>
    </template>

    <script>
    import axios from "axios";
    import ComponentA from "./ComponentA.vue";
    export default 
      data() 
        return 
          isLoading: false,
          result: []
        ;
      ,
       components: 
        ComponentA,
      ,
       created() 
        this.loadData();
      ,
       methods: 
           async loadData() 
              let self = this;

              console.log("fetch");

              self.isLoading = true;
              const  data  = await Endpoints.get();
              self.isLoading = false;
              self.api = data;
              console.log(data); // returns the data as intended
            
       
    </script>

组件A也很简单

<template>
  <Label :text="somevariable"></Label>
</template>
<script>
export default 
  data() 
    return 
      somevariable: 0
    ;
  ,
  props: 
    api: 
      type: Number,
      required: true
    
  ,
  mounted() 
     this.somevariable = this.api;
  
;
</script>

我得到的错误是 [Vue warn]: Invalid prop: type check failed for prop "api"。值为 NaN 的预期数字,在组件 A 中未定义,在对 console.logs 进行一些引用和重新引用后,它实际上获取了该值。我不确定为什么会这样,我的方法是错误的吗?这让我很沮丧,已经有几个小时想不通了。

【问题讨论】:

据我所知,在父组件中没有 api.somevariable 直到异步请求完成 我觉得它试图在实际获取变量之前获取它。也许,如果是这样,如何解决这个问题 也许让创建的异步,或者在你有数据之前不渲染组件A 还是不行 【参考方案1】:

api 没有在data 中为第一个组件定义,因此它不会是反应式的。这应该会在控制台中给您一条警告消息。

data () 
  return 
    api: null,
    isLoading: false,
    result: []
  ;

第二个问题是,当组件第一次渲染时,它还没有从服务器加载api。使用await 对此无济于事,渲染模板将在异步请求完成之前发生。

鉴于componentA 当前的编写方式,它无法处理api 在首次创建时丢失的情况。因此,您需要使用v-if 来推迟创建,直到该数据可用:

<ComponentA v-if="api" :api="api.somevariable"></ComponentA>

如果没有v-if 检查,它只会传递api 的初始值,在您的原始代码中是undefined。这就是导致问题中提到的警告的原因。

当您谈到“console.logs 的引用和重新引用”时,我会假设这些更改只是触发了热重新加载,这很容易导致组件使用新数据重新渲染。否则不会发生这种情况,因为 api 未包含在原始 data 中导致缺乏反应性。

【讨论】:

它实际上可以工作,永远不会考虑这一点,谢谢;)

以上是关于未定义的变量 - 虽然 api fetch |爱讯 |道具的主要内容,如果未能解决你的问题,请参考以下文章

使用fetch-mock和isomrphic-fetch模拟post请求时,res.json()是未定义的

fetch not working 结果在 Node.js 中未定义

类型错误:在 reactjs 中使用 fetch 读取 json 时未定义项目

获取调用中未定义标头

无法读取未定义的属性“获取”

虽然未定义变量 - 等待