【问题标题】:Vue.js - error when rendering componentVue.js - 渲染组件时出错
【发布时间】:2017-06-05 04:01:58
【问题描述】:

数据在 firebase 上,我只想显示 1 个带有 [objectNumber] 的对象,请参阅模板中的 {{ligler[1].name}},但是当我这样做时它可以工作,但出现错误:

  • 渲染组件时出错
  • 未捕获的类型错误:无法读取未定义的属性“名称”

我认为,问题在于组件之前加载的数据。

当我使用 v-for 时,它会显示所有对象的名称而不会出错,但我只想显示一个对象。

模板如下:

<template>
  <div id="app">
  <h1>{{ligler[1].name}}</h1>
  </div>
</template>

脚本:

<script>
import Firebase from 'firebase'

let config = {
    apiKey: "xxxxxxxxxx",
    authDomain: "xxxxxxxxxx",
    databaseURL: "https://xxxxxxxxxx.firebaseio.com"
}

let app = Firebase.initializeApp(config);
let db = app.database();

let ligRef = db.ref('ligler');

export default {
  name: 'app',
  firebase: {
    ligler: ligRef
  }
}
</script>

我尝试将 v-if 添加到 h1,但这不起作用。

我该如何解决这个错误?

【问题讨论】:

  • console.log(ligRef); 的输出是什么?将此行放在导出之前
  • U {u: Te, path: L, m: ee, Nc: false, then: undefined…}是输出

标签: javascript vue.js vuejs2


【解决方案1】:

像这样进行空检查:

<h1>{{ligler[1] && ligler[1].name}}</h1>

使用&amp;&amp;|| 被称为逻辑运算符short circuiting,这意味着如果没有必要,它们不会计算右侧。这是widely used,因为它很简洁。

这里如果 ligler[1] 未定义,它不会评估 ligler[1].name 并且您不会收到错误,这相当于在访问内部属性之前放置一个 if。

如果您有更多组件可以访问ligler[1] 的其他属性,则使用v-if 更有意义,否则上面的代码更好。

  <div v-if="ligler[1]">
    <h1>{{ligler[1].name}}</h1>
    <h1>{{ligler[1].age}}</h1>
    <h1>{{ligler[1].etc}}</h1>
  </div>

【讨论】:

  • 这行得通!!!!你能解释一下为什么我必须添加 ligler[1] && 吗?只是为了识别ligler?
  • 谢谢!!! v-if="ligler[1]" 也可以,用哪个更好?
  • @Saurahbh,我还有一个问题.. 在我的数据中,我有 ligler[1].currentWeek 和 ligler[1].weeks 如何将 currentWeek 设置为变量以使用它来显示当前ligler[1].周?
【解决方案2】:

通常您可以使用v-if 来简化此操作:

<template>
  <div id="app" v-if="ligler[1]">
    <h1>{{ligler[1].name}}</h1>
  </div>
</template>

【讨论】:

  • 这行得通!这个解决方案比

    {{ligler[1] && ligler[1].name}}

    更好吗?
  • @Can 这取决于。如果整个组件依赖于ligler[1],则使用v-if,如果它只是组件的一小部分,则使用&amp;&amp;