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

2 javascript vue.js vue-component vuejs2

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

我有聊天消息,其中有两个数组:

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

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

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

<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;
Run Code Online (Sandbox Code Playgroud)

而且都不起作用...

有什么帮助吗?:D

可以在没有额外库的情况下完成吗?我不需要动画就可以出现在元素的底部......

谢谢

Sir*_*nce 5

看这个例子:

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

使用“watch”( https://v2.vuejs.org/v2/guide/compulated.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'});
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)