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)
в вашем компоненте.
Мой результат:
ДО:
ПОСЛЕ:
Ответ 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
внешнюю ссылку на заголовок тега.