2017-09-30 3 views
0

非同期呼び出しが発生するまで作成されない項目のリストがあります。私は、作成されたアイテムの最初(または任意)のgetBoundingClientRect()を取得する必要があります。非同期呼び出しでコンポーネントの参照を取得する

は、例えば、このコードを取る:

<template> 
    <div v-if="loaded"> 
     <div ref="myItems"> 
      <div v-for="item in items"> 
       <div>{{ item.name }}</div> 
      </div> 
     </div> 
    </div> 
    <div v-else> 
     Loading... 
    </div> 
</template> 

<script> 
    import axios from 'axios'; 

    export default { 
     data() { 
      return { 
       items: [] 
      } 
     }, 
     created() { 
      axios.get('/url/with/some/data.json').then((response) => { 
       this.items = response.data; 
       this.loaded = true; 
      }, (error) => { 
       console.log('unable to load items'); 
      }); 
     }, 
     mounted() { 
      // $refs is empty here 
      console.log(this.$refs); 

      // this.$refs.myItems is undefined 
     } 
    }; 
</script> 

をだから、私はmounted()方法でmyItems REFにアクセスしようとしているが、this.$refsは、この時点で{}空です。したがって、watchというコンポーネントを使用して、さまざまな方法でrefの値を読み取ることができたのを確認しようとしましたが、失敗しました。

私を正しい方向に導くことができる人は誰ですか?

いつも、ありがとうございました!

UPDATES

追加mounted()方法でthis.$watch$refsはまだ{}として戻ってきます。その後、updated()メソッドをコードに追加してから$refsにアクセスでき、動作するように見えました。しかし、これが正しい解決策であるかどうかは分かりません。

vuejsは通常、非同期データに基づいてdivを画面上の位置に動的に移動するような処理を行いますか?これは、私がやろうとしているのと似ています。一度レンダリングされると(非同期データに基づいてレンダリングされていなければならない場合)、要素を画面上で取得し、何かをするためにアクセスしますポジションに)?

答えて

0

マウント中にthis.$refs.myItemsを実行する代わりに、axiosの約束が応答を返した後で実行できます。

あなたもitemsloadedを更新し、SOUあなたが時計を使用したい場合は、あなたがそれらの

+0

は、私はより多くの情報については、上記の追加されたコメントを読んで使用することができます。 – Sean

+0

申し訳ありませんが、私はあなたが何を求めているのか分かりません。このフィドルを見てくださいhttps://jsfiddle.net/0mf2w3hL/ 'ref'は非同期呼び出しの後に動作します – Daniel

関連する問題