Vuejs can't access refs from component

后端 未结 7 1316
终归单人心
终归单人心 2020-12-17 07:45

I am trying to get the canvas element which is inside a template of a component, found great documentations for vuejs1 but not for vuejs2 where "ref" is the only w

相关标签:
7条回答
  • 2020-12-17 08:20

    In may case, I use v-for like:

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

    And

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

    In this case, I solve this by:

      watch: {
        'pubList': {
            handler:function(newArray) {
                 if(newArray.length===0){
                    return
                  }
                 this.$nextTick(function() {
                   console.log(this.$refs.lazyImages)
                 })
              },
           immediate:true
        }
      }
    
    0 讨论(0)
  • 2020-12-17 08:22

    You can use $nextTick() function, code inside $nextTick() will run after DOM update.

    this.$nextTick(function () {
    
        console.log(this.$refs.ANY_COMPONENT_REF)
    
    })
    
    0 讨论(0)
  • 2020-12-17 08:22

    @Dan Levin 's answer works.

    methods: {
    fecthData() {
        this.data ={ ... }; // assume the fetched data have changed DOM here.
    
        this.$nextTick(() => {
          console.log(this.$refs); // returns obj
          console.log(this.$refs.target); // returns el
        });
    }
    

    this works also with v-for.

    0 讨论(0)
  • 2020-12-17 08:27

    To point at vue instance to self variable worked for me, info source

    created() {
        let self = this;
        console.log(self.$refs.icanvas);
    },
    
    0 讨论(0)
  • 2020-12-17 08:28

    I also ran into this error. The way i fixed this issue was by getting the refs in the updated hook. See my example below.

    In my data object I have an empty array called 'products'.

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

    In the updated hook I check if any refs are found. If not then nothing will happen. Then when there are products found, the script will continue. Next time Vue will come into the updated hook again, your script won't be triggerd again because now the length of the products array is bigger than one (if any refs could be found of course).

    updated() {
        let products = this.$refs.products;
        if (!products || this.products.length > 0) return;
    
        this.products = products;
        // run your logic here
    }
    
    0 讨论(0)
  • 2020-12-17 08:32

    i had the exact same issue, in my case i solved it by accessing the ref in the method that changes the v-if with nextTick.

    methods: {
    open() {
      this.show = true; //v-if condition
        this.$nextTick(function() {
          this.titleWidth = this.$refs.titleBg.clientWidth - 30;
        });
    }
    
    0 讨论(0)
提交回复
热议问题