Vue JS возвращает данные [__ob__: Observer] вместо моего массива объектов

Я создал страницу, где я хочу получить все свои данные из базы данных с помощью вызова API, но я тоже новичок в VueJS и Javascript, и я не знаю, где я ошибаюсь. Я проверил его с Postman, и я вернул правильный JSON.

Это то, что я получаю:

[__ob__: Observer]
length: 0
__ob__: Observer {value: Array(0), dep: Dep, vmCount: 0}
__proto__: Array

Это то, что я хочу:

(140) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, …]
[0 … 99]
[100 … 139]
length: 140
__ob__: Observer {value: Array(140), dep: Dep, vmCount: 0}
__proto__: Array

Это мой файл шаблона Vue:

<template>
    <div>
        <h2>Pigeons in the racing loft</h2>
        <div class="card-content m-b-20" v-for="pigeon in pigeons" v-bind:key="pigeon.id">
            <h3>{{ pigeon.id }}</h3>
        </div>
    </div>
</template>

<script>
export default {
    data(){
        return{
            pigeons: [],
            pigeon: {
                id: '',
                sex: '',
                color_id: '',
                pattern_id: '',
                user_id: '',
                loft_id: '',
                country: '',
                experience: '',
                form: '',
                fatique: ''
            },
            pigeon_id: ''
        }
    },
    created(){
        this.fetchPigeons();
        console.log(this.pigeons); // Here I got the observer data instead my array
    },

    methods: {
        fetchPigeons(){
            fetch('api/racingloft')
            .then(res => res.json())
            .then(res => {
                console.log(res.data); // Here I get what I need
                this.pigeons = res.data;
            })
        }
    }
}
</script>

Я тоже пытался сделать это с аксиомами, но это дало мне то же самое. Когда я утешаю его из метода, он дает мои данные, но за его пределами ничего не дает.

Ответы

Ответ 1

Это происходит потому, что Vue js преобразует каждый элемент данных в нечто, что можно наблюдать. Так что имеет смысл, если вы что-то консоль записываете в данные. На выходе будет что-то завернуто в наблюдателя.

Чтобы лучше понять ваши данные, я предлагаю вам установить инструменты Vue dev. https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=en

Ответ 2

Можно также попробовать это:

var parsedobj = JSON.parse(JSON.stringify(obj))
console.log(parsedobj)

Его привел сам Эван Ты сюда

Но ожидание ответа - это первый шаг.

Ответ 3

Вероятно, вы должны дождаться, пока результат будет завершен, а затем console.log.

created(){
    this.fetchPigeons().then(() => console.log(this.pigeons));
},

То, как вы делали это, вы регистрировали результат синхронно, чтобы он выполнялся до того, как выполняется выборка.

Edit: Кроме того, как @barbsan отметил в своем комментарии ниже ваш fetchPigeons должен вернуть обещание для then, чтобы работать. fetch возвращает обещание, поэтому вам просто нужно вернуть fetch в fetchPigeons

fetchPigeons(){
    return fetch('api/racingloft')
    .then(res => res.json())
    .then(res => {
        console.log(res.data); // Here I get what I need
        this.pigeons = res.data;
    })
}

Ответ 4

Вот мое решение:

добавьте новый метод что-то вроде log в ваш компонент $ root. App.vue created рекомендуется:

this.$root.log = function log() {
  for (let i = 0; i < arguments.length; i += 1) {
    if (typeof (arguments[i]) === 'object') {
      try {
        arguments[i] = JSON.parse(JSON.stringify(arguments[i]));
      } catch (e) {
        console.error(e);
      }
    }
  }
  console.log(...arguments);
};

просто вызовите this.$root.log(this.pigeons) в вашем компоненте.

Мой результат:

ДО:

enter image description here

ПОСЛЕ:

enter image description here

Ответ 5

Спасибо за все ваши предложения. Вещи работали на моем конце, просто используя " const ".

const cookieInfo = ToolCookieService.getToolNumbersFromCookie();

Спасибо, Ранджит

Ответ 6

Вы можете использовать директиву v-if для рендеринга компонента, как только данные будут там.

<h3 v-if="pigeons.length > 0">{{ pigeon.id }}</h3>

Ответ 7

Как упоминал Хусам Ибрагим, вам следует дождаться разрешения функции async fetch(). Другим подходом может быть использование async/await в вашей функции:

methods: {
    async fetchPigeons(){
        await fetch('api/racingloft')
               .then(res => res.json())
               .then(res => {
                   console.log(res.data);
                   this.pigeons = res.data;
               })
    }
}

И тогда это должно работать:

<template>
  <div>
    <h2>Pigeons in the racing loft</h2>
    <div class="card-content m-b-20" v-for="pigeon in pigeons" v-bind:key="pigeon.id">
        <h3>{{ pigeon.id }}</h3>
    </div>
  </div>
</template>

Ответ 8

У меня та же проблема, которая все еще застряла...

Написал их в соответствии с методом Evan (Vue Author) JSON.parse(JSON.stringify(res.data)), но почему обычные данные не могут быть?

  methods: {
    async getdata() {
      console.log(1);
      await axios.get(API).then((res) => {
          console.log(2);
          if (!this.dataList.length) {
            this.dataList = JSON.parse(JSON.stringify(res.data));
            console.log(3);
            console.log(res.data, 'res.data ');
            console.log(this.dataList, 'this.dataList')
            console.log('----------check-----------',JSON.parse(JSON.stringify(res.data)));
          }
        })
        .catch(err => {
          console.error('failed: ' + err);
        })
      console.log(4);
    },

Ответ 9

Ну, у меня была точно такая же проблема, но я решил ее:

Просто переместите app.js внешнюю ссылку на заголовок тега.