I am learning vue. I have the following method where I add a chat message to a div with id="toolbar-chat". This div allows scrolling on y axis and I would like the div to jump to the top every time a new message is added. Why is my JS not working?
    document.getElementById("toolbar-chat").scrollTop = 0;
My vue method:
    methods: {
        addMessage(message) {
            this.messages.unshift(message);
            document.getElementById("toolbar-chat").scrollTop = 0;
            axios.post(chat_send_route, message)
            .then(response => {
                console.log(response.data);
            });
        }
    }
                This is happening due to way vue updates the dom asynchronously. See Reacivity in depth(Async update Queue)
To reflect changes immediately use vm.$nextTick(callback)
instead of querying the dom element using document.getElementById() I recommend add a ref attribute to your toolbar-chat element and reference it in your method using this.$refs. See docs for more on ref attribute
  <div id="toolbar-chat" ref="toolbarChat"></div>
So you method should be
methods: {
    addMessage(message) {
        this.messages.unshift(message);
        this.$nextTick(() => {
            this.$refs.toolbarChat.scrollTop = 0;
        });
        axios.post(chat_send_route, message)
        .then(response => {
            console.log(response.data);
        });
    }
}
Here is the working fiddle
Here is my solution :
One global div in main container
<div id="topDiv"></div>
One global function put in the Vue prototype :
Vue.prototype.$scrollTop = function () {
  var element = document.getElementById("topDiv");
  var top = element.offsetTop;
  window.scrollTo(0, top);
}
The same anchor everywhere :
<a @click="$scrollTop">Go to the top</a>
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With