【问题标题】:Unable to access nested elements and to apply functions in Vue template?无法访问嵌套元素并在 Vue 模板中应用函数?
【发布时间】:2021-03-30 14:05:17
【问题描述】:

我是 Web 开发的新手,遇到了一个我无法解决的问题... 我正在使用 Vuejs、Express、MongoDB 和 Fetch API...

在我的脚本中,我从本地服务器获取数据:

  mounted() {
    fetch("http://localhost:5000/api/" + this.$route.params.id)
      .then((res) => res.json())
      .then((data) => {
              this.data = data
              console.log(this.data.telegram.length)
      })
      .catch((err) => console.log(err.message))
  }

console.log 工作正常。

数据是这样返回的:

{ "_id": "6061ee831114fc4c211678e6", "path": "mypath", "telegram": [ { "date": "2021-03-21T22:00:00.708Z", "followers": 2188 }, { "date": "2021-03-22T18:40:04.751Z", "followers": 2195 } ], "__v": 0 }

然后数据存储为:

  data() {
    return {
      data: []
    }
  }

首先,我对我的数据格式感到惊讶。我相信它会以 JavaScript 格式出现,这意味着键上没有引号(“”)......我尝试 JSON.parse 响应,但它返回一个错误,就像它已经被解析一样。正常吗?

另外,在我的模板中,我无法访问此“数据”的属性。

例如:

<p>{{data.telegram[0]}}</p>

<p>{{data.telegram.length}}</p>

正在返回 'Uncaught (in promise) TypeError: Cannot read property '0' of undefined' 和 'Uncaught (in promise) TypeError: Cannot read property 'length' of undefined'。

好像有什么我不太明白...

任何帮助表示赞赏!

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    data.telegramundefined,直到您的挂载方法从服务器获得响应。我建议你用计算属性替换你的模板代码来检查你的数据是否有价值:

    <template>
      <p>{{mydata}}</p>
      <p>{{telegramLen}}</p>
    </template>
    
    <script>
    export default {
      computed: {
         mydata() {
            if (this.data != [])
               return this.data.telegram[0]
            return "No data"
         },
         telegramLen() {
            if (this.data.length > 0)
                return this.data.telegram.length
            return 0
         }
      }
    }
    </script>
    

    【讨论】:

    • 感谢您的回答。我认为 mount() 允许我在渲染之前获取数据?我尝试了您的建议,当我将mounted() 更改为beforeMount() 但仍然在控制台中提到“无法读取未定义的属性'0'”时,它起作用了。但是,这不完全是我的问题:我已经可以访问模板中的“数据”。如果我这样做 {{ data }} 我有整个响应,但我无法访问 data.telegram[0] 或任何嵌套...
    • Here你可以找到一个vue组件的生命周期。如果你想在渲染之前获取数据,你应该尝试使用created钩子而不是beforeMount。否则,如果您使用的是 vue-router,您可以添加 navigation guard beforeRouteEnter 并将您的调用移至此处的服务器,以便在渲染时您的组件数据已经被获取。我认为您无法访问 data.telegram[0] 或任何嵌套的内容,因为在获取之前未定义
    • 好的,谢谢,我真的需要了解更多关于钩子的知识!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    相关资源
    最近更新 更多