Vue JS返回[__ob__:Observer]数据而不是我的对象数组


77

我已经创建了一个页面,我想通过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>

我也尝试过使用axios做到这一点,但是它给了我完全相同的东西。当我从方法中进行控制台操作时,它提供了我的数据,但是在外部它什么也没有提供。


尝试用
F_Mekk

3
您正在尝试在异步获取完成之前将数据记录在created()中,因此它仍然为空(Vue用于检测数据更改的Observable除外,例如获取完成时,以便可以重新呈现)的组分)。
丹尼尔贝克

Answers:


58

也可以尝试以下方法:

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

它被带到埃文你自己在这里和更多的信息在这里

但是等待答案是第一步。


为什么这不能帮助我和提出问题的人解决问题?除了stackoverflow.com/a/56013942/5057913之外,我从下面尝试了所有解决方案 。怎么不知道在哪里保存代码。当我在该观察者上确实有值阵列的值时,当我在代码中使用上述代码时,我会得到空数组
Saugat Thapa

10

发生这种情况是因为Vue js将数据中的每个项目都转换为可以观察到的东西。因此,如果您在数据中控制台记录某些内容,这是有道理的。输出将是包装到观察者中的东西。

为了更好地了解您的数据,建议您安装Vue开发工具。 https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=zh-CN


是啊谢谢。我使用Vue开发工具。但是当我使用它时,我只看到<Root> = $ vm0,即使单击它也没有其他显示。
Shawnest 18-10-18

您在寻找好的组件吗?您能添加一下您在开发工具中看到的截图吗?这将有助于弄清楚发生了什么。
凯文·勒·戈夫

5

这是我的解决方案:

log在您的$ root组件中添加类似的新方法。App.vuecreated建议:

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)您的组件即可。

我的结果:

之前:

在此处输入图片说明

后:

在此处输入图片说明


3

您可能应该等待提取完成,然后console.log结果..

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

您执行操作的方式是同步记录结果,以便在完成提取之前执行结果。

编辑:也正如@barbsan在下面的评论中指出的那样,您fetchPigeons需要返回then工作承诺。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;
    })
}

[Vue警告]:在创建的钩子中出错:在Resources / js / components / Pigeons .--> <Pigeons>中找到的“ TypeError:无法读取未定义的属性'then'”。vue <Root>我得到了这个。控制台和渲染都没有向我显示我有对象。
Shawnest 18-10-18

1
@HusamIbrahimfetchPigeons不返回承诺,您还需要在return之前添加fetch
barbsan

@barbsan感谢您指出这一点。我错过了那部分。+1
Husam Ibrahim

实际返回已解决问题,但我仍然无法将其呈现到页面。我不知道问题是什么。我正在关注youtube视频系列,而且效果也不错。我不知道我设置不正确。它还会在vue开发工具中向他们显示有关Vuejs数据的信息,而我只看到<root> = $ vm0,即使单击它也没有看到其他内容。
肖恩斯特(Shawnest),

该问题必须易于解决,因为如果我设置了消息变量并将其设置为{{message}},它确实会显示在页面中。但是,如果我只是用创建或装载的数据来修改数据,那么我只会得到一个空数组,这就是为什么我不渲染任何东西的原因。
肖恩

1

v-if一旦数据存在,您就可以使用指令来呈现组件。

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

1

如Husam Ibrahim所述,您应该等待异步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>

我们可以使用标准承诺代替await吗?
Shamoon

当然可以,但是您可能必须在另一个函数中处理promise解析。
安德烈·拉瓦齐

1

感谢您的所有建议。仅使用“ const ”,事情就对我有效。

const cookieInfo = ToolCookieService.getToolNumbersFromCookie();

谢谢,兰吉特


0

我仍然遇到同样的问题...

根据Evan(Vue作者)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);
    },

0

如果您的目标是调试ObserverVue实例中包含的内容,这是我的解决方案:

打印出该template块中的变量属于您的组件

之后,您可以重新格式化输出的结构以观察细节。

例如:

<template>
  <div>
    {{ pigeons }}
  <div>
</template>

换句话说,如果您想在中看到它console,则应该console.log进入mounted阶段。因为在created阶段,this.pigeons仍然是空的。参考:https : //vuejs.org/v2/guide/instance.html#Lifecycle-Diagram

希望对您有所帮助。



0

基本上,您要做的是该函数获取鸽子数组,但是在并行运行时,您调用了console.log。轻松解决:

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.