Skip to content

Issues with inverted/top infinite load. #70

@lanmaster53

Description

@lanmaster53

Below is the code I've put together to do inverted infinite scrolling. I want the behavior to behave exactly like your demo, however, I keep running into the following issues and cannot figure out why mine is behaving different than yours.

  1. The initial load won't start at the bottom of the scroll element unless the slot attribute is bound. It's weird. If I override a slot with a template alone, it starts at the top of the scroll element, which is wrong. If I override a slot with the attribute alone, it starts at the bottom of the scroll element, which it should. I prefer to override with a template, so in order to make it work I have to include the template and the attribute binding with an empty object as shown in the code below. This doesn't seem right.
  2. The transition is not smooth. Whenever the infinite handler triggers, it automatically scrolls all the way to the top of all the new messages. This also isn't like your demo.

Do you see what I am doing wrong to cause these issues? Thanks!

Edit: This is partial code. I stripped out a bunch of other stuff that is unrelated to the infinite scroll stuff.

const template = `
<div class="flex-row messaging">
    <div class="flex-grow flex-column flex-justify-end messages">
        <div id="message-container" class="message-container">
            <infinite-loading target="#message-container" :slots="{}" :top="true" :identifier="infiniteId" :firstload="false" @infinite="infiniteHandler">
                <template #complete>
                    <span></span>
                </template>
            </infinite-loading>
            <div v-for="message in messages" v-bind:key="message.id" v-bind:message="message" class="flex-row message">
                ... stuff ...
            </div>
        </div>
    </div>
</div>
`

export default {
    name: "Messages",
    template,
    setup () {
        const messages = ref([]);
        const cursor = ref(null);

        function getMessages($state) {
            var query = "";
            if (cursor.value) {
                query = "?cursor="+cursor.value;
            };
            fetchWrapper.get(`${API_BASE_URL}/messages${query}`)
            .then(json => {
                cursor.value = json.cursor;
                // prepend messages with the older messages
                messages.value.unshift(...json.messages);
                if (json.next) {
                    $state.loaded();
                } else {
                    $state.complete()
                };
            })
            .catch(error => appStore.createToast(error));
        };

        function infiniteHandler($state) {
            getMessages($state);
        };

        return {
            messages,
            infiniteId,
            infiniteHandler,
        };
    },
};

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions