代码之家  ›  专栏  ›  技术社区  ›  Sølve T. DisgruntledGoat

处理未定义ajax数据的替代方法

  •  0
  • Sølve T. DisgruntledGoat  · 技术社区  · 7 年前

    在Vue中,我从未真正理解的一点是,应该如何使用未定义的“网络/异步密钥”来解决这个问题。

    举个例子:

    <template>
      <div>
        <h1>{{row.something_undefined_before_ajax_returns.name}}</h1>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          row: {}
        }
      },
      created() {
        axios.get('.../row/12')
          .then(response => {
            // response = {data: {something_undefined_before_ajax_returns: {name: 'John Doe'}}}
            this.row = response.data
         })
      }
    }
    </script>
    

    这将在控制台中返回以下警告: [Vue warn]: Error in render: "TypeError: Cannot read property 'name' of undefined" .然而 h1 最终将显示 John Doe 一旦Vue注册了异步更改。

    然而,直到现在,我处理这个问题的方法是简单地在js中定义期望的键,如下所示:

    <script>
    export default {
      data() {
        return {
          row: {
            something_undefined_before_ajax_returns: {}
          }
        }
      },
      ...
    }
    </script>
    

    通过这样做,Vue不会像预期的那样发出警告。然而,这在短期内确实有效,但一旦HTTP调用的返回数据变得更加复杂和嵌套,定义所有可能的结果就变得毫无意义。

    有没有办法告诉Vue在接到电话之前忽略此类警告?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bhojendra Rauniyar    7 年前

    你可以简单地使用 v-if :

    <h1 v-if="row">{{row.something_undefined_before_ajax_returns.name}}</h1>
    

    您还可以检查行属性:

    <h1 v-if="row && row.something_undefined_before_ajax_returns">
     {{row.something_undefined_before_ajax_returns.name}}
    </h1>
    

    抱歉,我没有注意到行是一个对象,要检查它,您可以使用如下方式:

    v-if="Object.keys(row).length"
    

    但我认为你不需要检查对象,只需要检查它的属性,所以你只需要:

    v-if="row.something_undefined_before_ajax_returns"