2016-07-13 31 views
1

私はVue.jsと公式のルータを備えたシングルページアプリケーションで作業しています。Vue.jsルーター:コンポーネントの準備が完了したらコードを実行

ルータを使用してロードするすべてのセクションごとにメニューとコンポーネント(.vueファイル)があります。すべてのコンポーネントでは、私はこれに似たいくつかのコードがあります。私は、コンポーネントが中に移行し終わった後(jQueryプラグインINIT)コードの一部を実行したい

<template> 
    <div> <!-- MY DOM --> </div> 
</template> 

<script> 
    export default { 
     data() {}, 
     methods: {}, 
     route: { 
      activate() {}, 
     }, 
     ready: function(){} 
    } 
</script> 

を私はreadyイベントで私のコードを追加した場合、コンポーネントが初めてロードされたときにのみ起動されます。 route.activateでコードを追加すると良いですが、DOMはまだロードされていないので、私のjQueryプラグインを初期化することはできません。

コンポーネントの移行が完了し、DOMの準備が整うたびにコードを実行するにはどうすればよいですか?

答えて

1

Vue.jsルーターを使用しているため、新しいルートに移行するたびにVue.jsがDOMを更新する必要があります。デフォルトでは、Vue.jsはDOM更新を非同期で実行します。

Vue.jsがDOMの更新を完了するまで待つために、Vue.nextTick(コールバック)を使用できます。コールバックは、DOMが更新された後に呼び出されます。あなたのケースでは

、あなたが試すことができます:さらなる情報については

route: { 
    activate() { 
     this.$nextTick(function() { 
      // => 'DOM loaded and ready' 
     }) 
    } 
} 

を:

+0

問題はreadyメソッドはコンポーネントがロードされて初めて実行されますが、別のルートに移動すると、このメソッドに戻ります。実行可能なメソッドは実行されません。ルートが呼び出されるたびに実行する必要があります。 –

+0

私のコードサンプルを更新しました;) – maoosi

+0

nextTickコールバックからコンポーネントdomに存在する要素$( '。test')にアクセスしようとしていますが、取得できません。それはsetTimeoutで動作するので、domがまだロードされていないようです –

0

これは少し遅れる場合がありますが...私が正しく推測すれば、あなたが問題があるコンポーネントは、あなたがnaルート間を移動する。このようにして、Vueはコンポーネントを再利用し、コンポーネントを破棄して再作成するのではなく、変更する必要のあるコンポーネントを変更します。 Vueはkey属性をProperly trigger lifecycle hooks of a componentに提供します。コンポーネントのkeyを変更することで、Vueに再表示することができます。詳細はkey in guide、コードサンプルはkey in apiを参照してください。

関連する問題