programing

Vue 스크롤 div to top inside 메서드

prostudy 2022. 5. 28. 09:05
반응형

Vue 스크롤 div to top inside 메서드

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>

목록에 OK 메시지가 추가되지만 다음 오류가 발생합니다.

[Vue warn] :nextTick 오류: "TypeError: 정의되지 않은 'scrollTop' 속성을 설정할 수 없습니다."

요소의 이름(camel Case)이 그렇게 되어 있습니까?내가 뭘 놓쳤지?

스크롤할 요소가 컴포넌트 내에 있으므로 호출할 수 있는 메서드를 해당 컴포넌트에 구현해야 합니다.

예를 들면,chat-messages컴포넌트...

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

그리고 Vue 인스턴스에서ref그 컴포넌트에 대해서...

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

또,addMessage메서드...

this.$refs.messages.scrollToTop()

이러한 목적으로 scrollIntoView() 메서드를 사용할 수 있습니다.예를 들어 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/45724709/vue-scroll-div-to-top-inside-method

반응형