2016-01-15 12 views
6

Vue.jsで簡単なチャットアプリを構築しようとしています。私の問題は、新しいメッセージが書き込まれるときにメッセージ領域が下にスクロールする必要があるということです。Vue.js:v-for後のイベント

私はv-for指示文でメッセージをループします。 v-forがDOMを更新したときにイベントがありますか?

メッセージ領域divがコンポーネントのメッセージ配列をリッスンするようにしました。私は、配列にメッセージを追加しているのと同じ関数で、メッセージ領域のdivのscrollTopを99999に設定しようとしました。しかし、問題はv-forがDOMを更新していないため、スクロールできません正しい点。

+0

行われ、 'V-for'ループ後のフックやイベントがある場合、私は知りませんが、あなたが比較のために、すべてのように行うことができます最後の反復であるかどうかを確認するための実際のインデックス? '$ index === array.length - 1'のようなものをdivやscrollにするためにクラスやスタイルにバインドしますか? –

答えて

3

watchを試しましたか?

var vm = new Vue({ 
    data: { 
    messages: [] 
    }, 
    watch: { 
    'messages': function (val, oldVal) { 
     //Scroll to bottom 
    }, 
    } 
}) 

編集:このソリューションは、DOMが更新されていることを確認するためにnextTick機能を使用する必要として、他の回答を参照してください。

+0

これは実際に動作します!変数が変更されたときだけ 'watch 'がトリガされると思っていました。ありがとう! – Risse

+0

ウォッチャーからvueインスタンスのメソッドを呼び出す方法はありますか? –

+1

@SebastianHernandez「this」を使用してください – Jeff

17

私は同様の問題がありましたが、私はvue.nextTick()を使って別のアプローチをとっていました。 v-forがレンダリングを完了したことを確認する必要がありました。コンポーネントがすぐに再レンダリングされないため、キューが空のときに次の「ティック」で更新されます。

Vue.component('message', { 
    data() { 
    return { 
     message: [] 
    } 
    }, 
    methods: { 
    updateMessageArray(newMessage) { 
     this.message.push(newMessage); 

     this.$nextTick(() => { 
     // Scroll Down 
     }) 
    } 
    } 
}) 

https://vuejs.org/v2/api/#Vue-nextTick

https://vuejs.org/v2/guide/reactivity.html#Async-Update-Queue

+1

これは有効な解決策です!次のチックは、インスタンスデータで指定した変更をDOMでレンダリングすることを保証できる唯一のものです。変更がDOMに適用される前に、上記の解決策がスクロールダウンされます。後でそれらを適用したい場合は、このソリューションを使用してください:)。 –

+0

これはより良い解決策です! –

+0

@CristiJoraは 'this。$ nextTick(function(){})'の後に適用される変更について述べています。この解決策は素晴らしいです –

関連する問題