mounted 方法在加载数据之前被触发 - VueJS

mounted method is fired before data loaded - VueJS

我正在使用 Vue Resource 从 REST API 检索图像集。请求在我的 Vue 组件的 created 挂钩中发送。

问题是,我试图在 mounted 挂钩中访问检索到的数据,但数据未加载。

我在控制台中收到此错误:

[Vue warn]: Error in mounted hook: "TypeError: Cannot read property 'forEach' of undefined"

这是我的组件:

<script>
export default {
  data() {
    return { imgs : '' };
  },
  created() {
    // the full url is declare in my main.js
    this.imgs = this.$resource('acf/v3/pages/4');

    this.imgs.query().then((response) => {
      console.log('success', response);
      this.imgs = response.data.acf.gallery;
    }, (response) => {
      console.log('erreur', response);
    });
  },
  mounted() {
    // get the ref="image" in my dom template
    let imgs = this.$refs.image;

    imgs.forEach((img) => {
      // I do some stuff with imgs
    });
  }
}
</script>

如果我用 setTimeout 包裹 mounted 的内容,一切正常。

所以,我不明白如何在执行 mounted 挂钩之前等待我的数据加载。这不就是 Vue 生命周期钩子的作用吗?

由于 this.imgs.query() 调用是异步的,您的 mounted 挂钩在 then 处理程序设置 this.imgs 之前被调用(我假设它被绑定使用 v-for 到模板中具有属性 ref="image" 的元素)。因此,即使组件已安装到 DOM,$refs 尚未设置。

我会为 "do some stuff with imgs" 创建一个方法,然后在异步调用的 then 处理程序中的 $nextTick callback 中调用该方法。传递给 $nextTick 的回调将是 "executed after the next DOM update cycle",这意味着 $refs 将在此时设置。

<script>
export default {
  data() {
    return { imgs: '' };
  },
  created() {
    // the full url is declare in my main.js
    this.imgs = this.$resource('acf/v3/pages/4');

    this.imgs.query().then((response) => {
      console.log('success', response);
      this.imgs = response.data.acf.gallery;
      this.$nextTick(() => this.doStuffWithImgs());
    }, (response) => {
      console.log('erreur', response);
    });
  },
  methods: {
    doStuffWithImgs() {
      // get the ref="image" in my dom template
      let imgs = this.$refs.image;

      imgs.forEach((img) => {
        // I do some stuff with imgs
      });
    }
  }
}
</script>

如Vue实例的Lifecycle Diagram所示。在 Mounted Hook(这意味着我们可以访问 DOM)之后,还有 beforeUpdateupdated 钩子。这些钩子可以在数据更改时使用。我觉得 beforeUpdate 或者 update hook 可以在 created hook 获取数据后使用

<script>
   export default {
      data() {
         return { imgs : '' };
       },
   created() {
    // the full url is declare in my main.js
    this.imgs = this.$resource('acf/v3/pages/4');

    this.imgs.query().then((response) => {
        console.log('success', response);
        this.imgs = response.data.acf.gallery;
       }, (response) => {
         console.log('erreur', response);
     });
   },
  // here we can use beforeUpdate or updated hook instead of mounted
  beforeUpdate() {
    // get the ref="image" in my dom template
    let imgs = this.$refs.image;

    imgs.forEach((img) => {
    // I do some stuff with imgs
   });
 }
}
我希望这有帮助。