【问题标题】:How do I loop through an array of objects using v-for in Vue.js?如何在 Vue.js 中使用 v-for 遍历对象数组?
【发布时间】:2018-04-16 18:36:24
【问题描述】:

我正在努力迭代这个对象数组。我没有看到任何控制台错误,也不确定数据未显示的原因。

{
 "messages":[
  {
    "id":1,
    "sender":"frank",
    "message":"Lorem ipsum...",
    "time":1398894261,
    "status":"read"
  },
  {
    "id":2,
    "sender":"mary",
    "message":"Lorem ipsum...",
    "time":1390824261,
    "status":"read"
  },
  {
    "id":3,
    "sender":"john",
    "message":"Lorem ipsum...",
    "time":1308744200,
    "status":"unread"
  }
 ]
}

我正在使用 http get 请求并且数据正在输入,但我无法遍历它。这是我的js:

new Vue({
    el: '#app',
    data: '',
    ready: function() {
      // GET request
      this.$http.get('https://www.example.com/file.json', function (data) {
        // set data on vm
        this.$set('data', data.messages);
        }).error(function (data, status, request) {
            console.log('http request error')
        })
    }
  })

这是我的 html:

<div v-if="data">
  <li v-for="d in data">{{ d.sender }}</li>
</div>
<p>{{data[0].sender}}</p> <!-- this part works -->

【问题讨论】:

  • 首先,在创建消息时,将消息重新定义为数据对象中的空数组。而不是 $set,只需将 data.messages 分配给 this.messages,并使用计算属性从数据中提取消息并在模板​​中迭代它。

标签: javascript arrays json vue.js


【解决方案1】:

在AJAX请求的回调中,this不是vm,可以这样解决

  1. 使用箭头功能
  2. 使用var vm = this
  3. 使用.bind(this)

这支笔使用箭头功能:https://codepen.io/iampaul83/pen/bYpqgm

arrow function:

new Vue({
    el: '#app',
    data: '',
    ready: function () {
        // GET request
        this.$http.get('https://www.example.com/file.json', (data) => {
            // set data on vm
            this.$set('data', data.messages);
        }).error(function (data, status, request) {
            console.log('http request error')
        })
    }
})

var vm = this:

new Vue({
    el: '#app',
    data: '',
    ready: function () {
        // GET request
        var vm = this
        this.$http.get('https://www.example.com/file.json', function (data) {
            // set data on vm
            vm.$set('data', data.messages);
        }).error(function (data, status, request) {
            console.log('http request error')
        })
    }
})

.bind(this):

new Vue({
    el: '#app',
    data: '',
    ready: function () {
        // GET request
        this.$http.get('https://www.example.com/file.json', function (data) {
            // set data on vm
            this.$set('data', data.messages);
        }.bind(this)).error(function (data, status, request) {
            console.log('http request error')
        })
    }
})

【讨论】:

    【解决方案2】:

    您的问题可能是由于 vue.js 深度反应限制。(查看 vue 的文档) 我的建议是使用 push 而不是使用 this.$set 循环遍历您的响应并将结果一个元素地推送到您将在您的数据对象中声明的消息变量中。

    data.messages.forEach( (msg ) => { this.messages.push( msg ); }

    在您的模板循环中通过消息变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 2019-12-01
      • 2021-05-17
      • 2019-02-08
      • 1970-01-01
      • 2021-11-18
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多