Vue.js добавляет объекты в существующий массив - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь добавить элементы из ответа json в свой существующий массив, нажимая на кнопку, но у меня есть проблема с правильным добавлением этих элементов.

Здесь у меня есть пустой массив с именем results, в котором я храню свои данные из ответа.

export default {
  name: 'Posts',
  props: ['user_id'],
  data: function(){
      return{
          results: [],
          pageNumber: 1,
      }
  },.....

Это мой метод получения данных:

getData: function () {

    var vm = this;

    axios.get('http://127.0.0.1:8000/api/posts?page=' + vm.pageNumber)
    .then(function (response) {
        vm.results += response.data.data;

    })
    .catch(function (error) {
    });

},

В этом методе я добавляю данные ответа в массив следующим образом:

vm.results + = response.data.data;

Мое расположение корректно, но после этогомой массив результатов операции выглядит так: «[Object Object], [object Object] ...»

Я также пытался добавить новые элементы методом push:

vm.results.push (response.data.data);

Но затем элементы добавляются в новые массивы, но я хочу добавить объекты в существующий массив.

Вот структурамой ответ:

{"current_page":1,
"data":[
{
"id":60,
"title":"Post 1",
"body":"Post 1 body",
"created_at":"2018-06-09 18:33:40",
"updated_at":"2018-06-09 18:33:40",
"user_id":8
},
{
"id":61,
"title":"Post 2",
"body":"post 2 body",
"created_at":"2018-06-09 18:33:40",
"updated_at":"2018-06-09 18:33:40",
"user_id":8
},
etc...]

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Try:

vm.results =  vm.results.concat(response.data.data);

Это добавит массив "response.data.data" к массиву "results".

0 голосов
/ 10 июня 2018

ES6 способ сделать это - использовать оператор распространения ...:

let a = [{name: 'Peter'}]
let b = [{name: 'Joanna'}, {name: 'Steven'}]

// use JSON.stringify so you don't see [Object object] when console logging
console.log('[...a, ...b]' + JSON.stringify([...a, ...b]))

При использовании в массиве ...arr это означает дать мне все элементы в arr здесь , при использовании в объекте ...obj itозначает дать мне поверхностную копию всех перечислимых свойств obj.

Просто чтобы доказать, что это работает с вашим делом:

let origArr = [{
    "id": 58,
    "title": "Post 1",
    "body": "Post 1 body",
    "created_at": "2018-06-09 18:33:40",
    "updated_at": "2018-06-09 18:33:40",
    "user_id": 8
  },
  {
    "id": 59,
    "title": "Post 2",
    "body": "post 2 body",
    "created_at": "2018-06-09 18:33:40",
    "updated_at": "2018-06-09 18:33:40",
    "user_id": 8
  }
]
let response = {
  data: {
    "current_page": 1,
    "data": [{
        "id": 60,
        "title": "Post 1",
        "body": "Post 1 body",
        "created_at": "2018-06-09 18:33:40",
        "updated_at": "2018-06-09 18:33:40",
        "user_id": 8
      },
      {
        "id": 61,
        "title": "Post 2",
        "body": "post 2 body",
        "created_at": "2018-06-09 18:33:40",
        "updated_at": "2018-06-09 18:33:40",
        "user_id": 8
      }
    ]
  }
}

console.log(JSON.stringify([...origArr, ...response.data.data]))
0 голосов
/ 10 июня 2018

Прежде всего вам не нужно использовать var vm = this;, this.results будет работать даже в ваших аксиальных (и любых других) обратных вызовах в контексте компонента vue.

Но реальная проблемаявляется то, что вы используете оператор конкатенации += для добавления в массив.Просто используйте push с оператором распространения (...) вместо этого, и он должен работать.

axios.get('http://127.0.0.1:8000/api/posts?page=' + this.pageNumber)
.then(response => {
    this.results.push(...response.data.data);

})
...