$refs 内的 ref 数组在 Mounted() 内取消定义

Car*_*rlo 4 javascript vue.js vue-component

我正在开发一个简单的图像滑块组件。在模板中,我用来v-for创建img标签并ref保留对每个标签的引用。

Vue.component('slide', {
    template: `
    <div class="c-image-slider">
      <img ref="im" :key="image" class="c-image-slider__slide" v-for="image in images" :src="image">
    </div>
    `,
    data() {
      return {
        currentImage: 0,
        images: [],
      };
    },
    mounted() {
      this.images = images;
      console.log(this.$refs);
      console.log(this.$refs.im);
    },
  });
Run Code Online (Sandbox Code Playgroud)

在组件的钩子内,mounted()我试图记录this.$refs.im数组,但undefined结果是,尽管数组肯定在那里。我缺少什么?

这也是复制该问题的笔: https: //codepen.io/anon/pen/LQMMBK

Ber*_*ert 5

重新渲染是异步的。当您在此处设置安装的图像时:

this.images = images;
Run Code Online (Sandbox Code Playgroud)

您触发了重新渲染,但 Vue 不会立即执行此操作。在此之前,没有,$refs因为还没有渲染图像

当您立即记录时,其记录的内容与当时的情况$refs完全相同。然后发生预定的重新渲染,并且 Vue 填充.$refs

您可以使用$nextTick正确注销它。

mounted() {
  this.images = images;
  this.$nextTick(() => {
    console.log(this.$refs);
    console.log(this.$refs.im);
  })
}
Run Code Online (Sandbox Code Playgroud)

更新了

  • @carlo `console.log` 有时会有点误导,因为如果您记录一个对象,并且该对象稍后更新,那么当您检查它时,日志将显示更新的对象。例如,打开笔,然后打开日志。然后再次单击笔的“运行”。请注意,记录的内容是一个空对象“{}”,但如果您*检查*它,它会显示“im”属性,因为这是该对象的当前状态。基本上我希望 console.log 输出对该对象的引用,并且当您检查时它会显示当前状态。 (2认同)
  • @DobleL @carlo 这是误导。“mounted”是在初始渲染之后。该事件表明第一次渲染已完成。在 Mounted 中使用 `$refs` 是完全合法的。例如,如果在“data”中分配了图像,那么这两个对象都将被正确记录。这是一个例子。https://codepen.io/Kradek/pen/wyROZv (2认同)