2016-01-15 11 views
6

Sto provando a creare una semplice app di chat con Vue.js. Il mio problema è che l'area del messaggio deve scorrere verso il basso quando viene scritto un nuovo messaggio.Vue.js: evento dopo che v-for è fatto

I looping dei messaggi con direttiva v-for. C'è un evento quando v-for ha aggiornato il DOM?

Ho fatto in modo che l'area messaggi div divenga in ascolto. Ho provato a fare in modo che nella stessa funzione che sto aggiungendo il messaggio all'array, impostare l'scrollotop dell'area div del messaggio su 99999. Ma il problema è che v-for non ha fatto l'aggiornamento del DOM, quindi non scorrerà fino a il punto corretto.

+0

Non so se c'è un gancio o un evento dopo un 'ciclo v-for' è fatto, ma si può fare come in ogni per, confrontando il indice reale per verificare se è l'ultima iterazione? qualcosa come '$ index === array.length - 1' e legalo a una classe o uno stile per far scorrere il tuo div? –

risposta

3

Hai provato a utilizzare watch?

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

Edit: Si prega di vedere l'altra risposta, in quanto questa soluzione richiede l'utilizzo della funzione nextTick per garantire il DOM viene aggiornato.

+0

Huh, funziona davvero! Pensavo che "watch" si attivasse solo quando la variabile cambia, non dopo tutte le altre callback. Grazie! – Risse

+0

Qualche idea su come potrei chiamare un metodo dell'istanza vue da un osservatore? –

+1

@SebastianHernandez Basta usare 'this' – Jeff

17

Avevo un problema simile ma ho adottato un approccio diverso utilizzando vue.nextTick(). Avevo bisogno di essere sicuro che il v-for avesse finito il rendering poiché il componente non sarebbe stato ri-renderizzato immediatamente, Si aggiornerà al prossimo "segno di spunta" quando la coda è vuota.

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

Questa è una soluzione valida! La spunta successiva è l'unica cosa che può assicurare al DOM il rendering delle modifiche che hai specificato sui dati dell'istanza. La soluzione accettata da sopra scorrerebbe verso il basso prima che le modifiche vengano applicate al DOM. Se vuoi che vengano applicati dopo, usa questa soluzione :). –

+0

Questa è la soluzione migliore !! –

+0

come ha detto @CristiJora per le modifiche da applicare dopo 'this. $ NextTick (function() {})' questa soluzione funziona alla grande –

Problemi correlati