Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

vue: Uncaught TypeError: Cannot read property ... of undefined

I'm using [email protected] and the vue official webpack template to build an app.

When developing locally, I often see the warning Uncaught TypeError: Cannot read property ... of undefined, but the HTML can be rendered successfully. However, the HTML can't be rendered when it's deployed to Netlify with npm run build command. So I have to treat this warning seriously.

I learned from here that it's because "the data is not complete when the component is rendered, but e.g. loaded from an API." and the solution is to "use v-if to render that part of the template only once the data has been loaded."

There are two questions:

  1. I tried wrap v-if around multiple statements that's generating the warning but personal I think this solution is verbose. Is there a neat approach?
  2. "warnings" in local development turn into "fatal errors"(HTML can't be rendered) in production. How to make them the same? e.g. both of them issue warnings or errors?
like image 387
Jerry Zhang Avatar asked Dec 09 '16 01:12

Jerry Zhang


2 Answers

Just use v-if on a common parent to all the elements in your template relying on that AJAX call, not around each one.

So instead of something like:

<div>   <h1 v-if="foo.title">{{ foo.title }}</h1>   <p v-if="foo.description">{{ foo.description }}</p> </div> 

Do

<div>   <template v-if="foo">     <h1>{{ foo.title }}</h1>     <p>{{ foo.description }}</p>   </template> </div> 
like image 81
Bill Criswell Avatar answered Oct 03 '22 03:10

Bill Criswell


have you tried to initialize all the data you need? e.g. if you need a b c, you can do:

new Vue({   data: {     a: 1,     b: '',     c: {}   },   created(){     // send a request to get result, and assign the value to a, b, c here    } }) 

In this way you wont get any xx is undefined error

like image 24
Sabrina Luo Avatar answered Oct 03 '22 03:10

Sabrina Luo