Vue.js:完成v-for后的事件

Ris*_*sse 15 javascript dom vue.js

我正在尝试使用Vue.js构建一个简单的聊天应用程序.我的问题是,当写入新消息时,消息区域需要滚动到底部.

我用v-for指令循环遍历消息.当v-for更新DOM时是否有事件?

我已经使它成为消息区域div侦听组件的消息数组.我试过这样,在我将消息附加到数组的同一个函数中,它会将消息区div的scrollTop设置为99999.但问题是v-for没有更新DOM,所以它不会滚动到正确的观点.

小智 38

我有一个类似的问题,但我采取了不同的方法使用vue.nextTick().我需要确保v-for已经完成渲染,因为组件不会立即重新渲染,当队列为空时它会在下一个"滴答"时更新.

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

      this.$nextTick(() => {
         // Scroll Down
      })
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是一个有效的解决方案!下一步是唯一可以确保DOM呈现您在实例数据上指定的更改的操作。在将更改应用于DOM之前,从上方接受的解决方案将向下滚动。如果要在以后应用它们,请使用此解决方案:)。 (2认同)

Jef*_*eff 5

你试过使用watch吗?

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

编辑:请参阅其他答案,因为此解决方案需要使用该nextTick函数来确保更新 DOM。