【问题标题】:HTML is loading before Vue Instance is getting loaded在加载 Vue 实例之前加载 HTML
【发布时间】:2020-10-13 23:31:20
【问题描述】:

我正在使用 Axios 从外部 API 获取 JSON 并在 HTML 中创建账单模板。我的其他请求部分工作正常。但是这部分 Vue 抛出“属性未定义”的错误。 我尝试在脚本标记之间包装html代码,还尝试在页面加载之前使用windows.onload()函数触发我的脚本,但错误以这种方式向另一个方向抛出。

这是我的 Vue 代码

    <script>             
    $(document).on('click', '#btn_print', function(){ 
    var app3 = new Vue({
        el: '#app3',
        data: {
          printOrders: []
        },            
    mounted: function() {
        this. printExtraBill()
    },            
    methods: {          
        printExtraBill() {
            axios.get(`https://staging/wp-json/wc/v3/orders/137? 
        consumer_key=ck_123&consumer_secret=cs_456`)               
        .then(response => {
          this.printOrders = response.data;
          console.log(response);
          })
         .catch(error => {
         console.log(error);              
        });
    }
   }
 });
}
</script> 

这是我的 HTML 部分

    <div class ="container mt-5" id="app3">
      <div id="printToday" style="border:3px solid black">
          <h2 align="center">Name</h2>
          <h4 align="center">Address and Mobile</h4>
               
     <p v-for="orders, index in printOrders" id="getName">Id: {{orders.number}} <br> 
        {{orders.date_created}} <br>
        {{orders.billing.first_name + " " + orders.billing.last_name }}
     </p>
   <div>
     <h3 class="thick" v-for="(orders, index) in printOrders" id="total">
          Total : {{orders.total}} </br> Method : {{orders.payment_method_title}}</h3>

错误

Vue warn]: Error in render: "TypeError: Cannot read property 'first_name' of undefined"
vue.js:1897 TypeError: Cannot read property 'first_name' of undefined
    at eval (eval at createFunction (vue.js:11649), <anonymous>:3:568)
    at Proxy.renderList (vue.js:2658)
    at Proxy.eval (eval at createFunction (vue.js:11649), <anonymous>:3:359)
    at Vue._render (vue.js:3551)
    at Vue.updateComponent (vue.js:4067)
    at Watcher.get (vue.js:4478)
    at Watcher.run (vue.js:4553)
    at flushSchedulerQueue (vue.js:4311)
    at Array.<anonymous> (vue.js:1989)
    at flushCallbacks (vue.js:1915)
          

请帮忙.....

【问题讨论】:

  • 能否请您也包括完整的错误堆栈跟踪?
  • 嗨@Dipen Shah,我刚刚附上了问题的错误
  • 订单上的billing属性似乎为空,您能验证一下吗?
  • 不,我验证过了,实际上我得到的 JSON 数据填充了我定义的每个元素......
  • 我对此表示怀疑,您能否在您的问题中也包含printOrders JSON 对象?

标签: javascript html vue.js


【解决方案1】:

我非常怀疑您的 billing 属性是否始终被定义,但如果您这么说,以下应该能够解决您的问题:

<p v-for="orders, index in printOrders" id="getName">Id: {{orders.number}} <br> 
    {{orders.date_created}}
    <br />
    <span v-if="orders.billing">
        {{orders.billing.first_name + " " + orders.billing.last_name }}
    <span>
</p>

【讨论】:

  • 嗨@Dipen Shah,感谢您的回答。我得到了特定于该订单的 JSON 数据,我可以在控制台中查看它。但是当我按照你所说的那样使用 v-if 时,我会得到一个嵌套数组的未定义属性。我认为当我使用 Vue 实例时我做错了。只问一个问题,我们可以正确使用多个 Vue 实例。这是我处理这个特定 Get 请求的第三个 Vue 实例。
  • @Tom 我不知道你说的多个 Vue 实例是什么意思,肯定支持多个 vue 组件。
  • 如果你可以分享代码和box/stackblitz,我可以提供进一步的帮助。
  • 我已经以同样的方式通过 Axios 请求填充同一页面中的其他表。仅对于这一部分,我遇到了这个问题...
  • 我看到了,但没有查看数据,我不确定我能提供什么帮助,因为问题似乎与未定义的属性值有关,也许你可以调试你的 JS 并查看问题出在哪里。
【解决方案2】:

mounted生命周期更改为created,如下所示:

async created(){
    await this.printExtraBill()
}

加载页面时不会调用mounted 挂钩,因此不会设置数据道具:https://v3.vuejs.org/api/options-lifecycle-hooks.html#mounted

在服务器端渲染期间不会调用此钩子。

【讨论】:

  • 感谢您的回答。但我仍然收到“未定义属性”的错误...
  • @Tom 根据您的堆栈跟踪,看起来有些订单可能没有获得billing 属性或将其作为null 获得。在打印之前尝试添加验证以检查 null。 {{orders.billing ? orders.billing.first_name + " " + orders.billing.last_name: '-' }}
  • 我只收到一个用于测试目的的订单,对于该订单,我还获得了名字和其他元素......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
相关资源
最近更新 更多