Vuejs не может обращаться к refs от компонента

Я пытаюсь получить элемент canvas, который находится внутри шаблона компонента, нашел отличные документы для vuejs1, но не для vuejs2, где "ref" - ​​единственный способ получить элемент. Я получаю объект, но, когда я пытаюсь получить доступ к переменной, это undefined.

Мой html

<div id="app>
  <template id="image-capture">
    <div class="row" >
      <canvas ref="icanvas" ></canvas>
    </div>
  </template>
</div>

Мой js

const ic = {
  template: '#image-capture' ,

  created () {
    console.log(this.$refs); //this returns object
    console.log(this.$refs.icanvas); // but this is undefined
  }


}

const routes = [
  { path: '/ic', component:   ic},
]

const router = new VueRouter({
  routes 
})

 new Vue({
  router,
   }).$mount('#app')

Мне нужно получить элемент icanvas.

здесь консольный журнал

Ответ 1

created запускается до обработки шаблона.
Вы можете найти более подробную информацию здесь: https://vuejs.org/v2/guide/instance.html#Lifecycle-Diagram

Вы должны иметь доступ к $refs в событии mounted

mounted: function() {
    console.log(this.$refs.icanvas);
},

Ответ 2

Вы можете использовать функцию $ nextTick(), код внутри $ nextTick() будет запускаться после обновления DOM.

this.$nextTick(function () {

    console.log(this.$refs.ANY_COMPONENT_REF)

})

Ответ 3

у меня была точно такая же проблема, в моем случае я решил ее, обратившись к ссылке в методе, который изменяет v-if с помощью nextTick.

methods: {
open() {
  this.show = true; //v-if condition
    this.$nextTick(function() {
      this.titleWidth = this.$refs.titleBg.clientWidth - 30;
    });
}

Ответ 4

В любом случае я использую v-for, например:

<li class="list__item" v-for="(item,index) in pubList" :key="index">
   <img
      class="list__img lazy_image"
      ref="lazyImages"
    >
</li>

и

 //pubList is from ajax
 props: ['pubList'],

В этом случае я решаю это следующим образом:

  watch: {
    'pubList': {
        handler:function(newArray) {
             if(newArray.length===0){
                return
              }
             this.$nextTick(function() {
               console.log(this.$refs.lazyImages)
             })
          },
       immediate:true
    }
  }

Ответ 5

Я тоже столкнулся с этой ошибкой. Я решил эту проблему, получив ссылки в обновленном хуке. Смотрите мой пример ниже.

В моем объекте данных у меня есть пустой массив с именем 'products'.

data() {
    return {
        products: []
    }
}

В обновленном хуке я проверяю, найдены ли ссылки. Если нет, то ничего не произойдет. Затем, когда найдены продукты, сценарий будет продолжен. В следующий раз, когда Vue снова попадет в обновленный хук, ваш скрипт больше не будет запускаться, потому что теперь длина массива products больше единицы (если, конечно, могут быть найдены какие-либо ссылки).

updated() {
    let products = this.$refs.products;
    if (!products || this.products.length > 0) return;

    this.products = products;
    // run your logic here
}