在特定元素的Vue中向下滚动

时间:2018-10-23 14:31:19

标签: javascript vue.js vuejs2 vue-component

我试图在vue中向下滚动新出现的元素:

我有两个数组的聊天消息:

data() {
  return {
    activeChats: [],
    openedChats: [],
    maxOpened: math.round(window.innerWidth / 300), 
  }
}

当我收到新消息并且对话不在活动和打开的数组中时,我将两者添加到屏幕上,因为我在两个数组上都使用了v-for

这一切正常,但是当出现新的聊天时,我不确定如何在div上向下滚动,我尝试使用裁判,但没有运气:

<div class="chat" v-for="chat in openedChats" ref="chat-{chat.id}"></div>  甚至只是打开一个聊天就进行聊天测试。

成功之后,在axios then()里面,我说:

this.$refs.chat['-'+response.data.id].scrollTo(9999999,99999999);
or
this.$refs.chat['-'+response.data.id].scrollTop = 99999999;
or
this.$refs.chat.scrollTo(9999999,99999999);
or
this.$refs.chat.scrollTop = 99999999;

两者都不起作用...

有什么帮助吗? :D

可以在没有附加库的情况下完成此操作,我不需要动画就可以出现在元素的底部...

谢谢

1 个答案:

答案 0 :(得分:1)

请参见以下示例:

https://jsfiddle.net/eywraw8t/430100/

使用“ watch”(https://vuejs.org/v2/guide/computed.html)来检测消息数组中的更改(从ajax或仅是示例中的一个按钮)。 根据邮件的索引设置ID(或者您可以根据需要使用ref)。 然后滚动到数组中的最后一个元素(通过array.length获取最后一个)。

new Vue({
  el: "#app",
  data: {
    messages: [
      { id: 1, text: 'message' },
    ],
  },
  watch:
  {
    messages: function() {
      let id = this.messages.length;
      //takes a bit for dom to actually update
      setTimeout(function() {
          document.getElementById('message-' + id).scrollIntoView();
      }, 100);
      
    },
  },
  methods: {
    addMessage: function(){
      let id = this.messages.length + 1;
      this.messages.push({ id: id, text: 'message'});
    }
  }
})
<div id="app">
  <button v-on:click="addMessage()" style="position:fixed">
  Add message
  </button>
  <div class="message" v-for="message in messages" :id="'message-' + message.id">
    {{message.text}} {{ message.id}}
  </div>
</div>