Vue滚动div到顶部内部方法

时间:2017-08-17 00:03:16

标签: javascript vuejs2 vue-component

学习Vue。当找到新的聊天条目时,尝试将聊天窗口div滚动到顶部。

我的Vue组件是:

const app = new Vue({ 
    el: '#toolbar-chat',

    data: {
        messages: []
    },

    created() {
        this.fetchMessages();

        Echo.private(chat_channel)
            .listen('ChatMessageSent', (e) => {
                this.messages.unshift({
                    message: e.data.message,
                    player: e.data.player.nickname
                });
            });
    },

    methods: {
        fetchMessages() {
            axios.get(chat_get_route)
                .then(response => {
                    this.messages = response.data;
                });
        },

        addMessage(message) {
            this.messages.unshift(message);

            this.$nextTick(() => {
                this.$refs.msgContainer.scrollTop = 0;
            });

            axios.post(chat_send_route, message)
                .then(response => {
                    console.log(response.data);
                });

        }
    }
});

我的聊天讯息模板

<template>
    <div ref="msgContainer" class="toolbar-chat">
        <div class="row">
            <div class="col-xs-12" v-for="message in messages">
                <strong class="primary-font">
                    {{ message.player.nickname }}:
                </strong>
                {{ message.message }}
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        props: ['messages']
    };
</script>

我的聊天发送模板

<template>
    <div class="input-group input-group-sm">
        <input id="btn-input" type="text" class="form-control" value="" required="required"  maxlength="140" placeholder="Type your message here..." v-model="newMessage" @keyup.enter="sendMessage">
        <div class="input-group-btn">
            <button class="btn btn-primary" type="button"  id="btn-chat" @click="sendMessage">
                <i class="fa fa-paper-plane"></i>
            </button>
        </div>
    </div>
</template>

<script>
    export default {
        props: ['player'],

        data() {
            return {
                newMessage: ''
            }
        },

        methods: {
            sendMessage() {
                this.$emit('chatmessagesent', {
                    player: this.player,
                    message: this.newMessage
                });

                this.newMessage = ''
            }
        }
    }
</script>

在我的页面中,我包含模板

<div class="col-xs-12 col-md-4" id="toolbar-chat">
    <chat-messages :messages="messages"></chat-messages>
    <chat-form v-on:chatmessagesent="addMessage" :player="{{ Auth::user() }}"></chat-form>
</div>

消息添加到列表中确定,但是我收到此错误:

  

[Vue警告]:nextTick出错:“TypeError:无法设置未定义的属性'scrollTop'”

这是元素命名的方式(camelCase)吗?我错过了什么。

2 个答案:

答案 0 :(得分:2)

由于您要滚动的元素位于组件中,因此您应该在该组件上实现一个可以调用的方法。

例如,在您的chat-messages组件中......

methods: {
  scrollToTop () {
    this.$el.scrollTop = 0
  }
}

并在您的Vue实例中,为该组件添加ref ...

<chat-messages ref="messages"...

并使用addMessage方法......

this.$refs.messages.scrollToTop()

答案 1 :(得分:0)

我们可以将scrollIntoView()方法用于此目的,例如:

this.$refs.yourRef.$el.scrollIntoView();