首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue scroll div to top to方法

Vue scroll div to top to方法
EN

Stack Overflow用户
提问于 2017-08-17 08:03:16
回答 2查看 7.7K关注 0票数 3

学习Vue。尝试让聊天窗口div在找到新聊天条目时滚动到顶部。

我的Vue组件是:

代码语言:javascript
复制
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);
                });

        }
    }
});

我的聊天消息模板

代码语言:javascript
复制
<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>

我的聊天发送模板

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<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>

一条消息添加到列表OK,但我得到这个错误:

Vue warn: nextTick中出错:"TypeError:无法设置未定义的属性'scrollTop‘“

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-17 08:31:31

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

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

代码语言:javascript
复制
methods: {
  scrollToTop () {
    this.$el.scrollTop = 0
  }
}

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

代码语言:javascript
复制
<chat-messages ref="messages"...

addMessage方法中...

代码语言:javascript
复制
this.$refs.messages.scrollToTop()
票数 3
EN

Stack Overflow用户

发布于 2020-08-07 05:11:14

我们可以使用scrollIntoView()方法来达到这个目的,例如:

代码语言:javascript
复制
this.$refs.yourRef.$el.scrollIntoView();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45724709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档