Web猫ブログ | 無限スクロールを実現する
無限スクロールを実現する
7/23/2019
Nuxt
Contentful
TypeScript
Vue

インストールする

yarn add vue-infinite-loading

型を定義する

下記の通り型を定義する。

declare module 'vue-infinite-loading' {
  import Vue from 'vue'

  export default class InfiniteLoading extends Vue {
    spinner: string;
    direction: string;
    distance: number;
    onInfinite: Function;
    forceUseInfiniteWrapper: boolean;
  }

  export interface StateChanger {
    complete(): void;
    loaded(): void;
    reset(): void;
  }
}

後になって気付いたんですが、開発元の issue を見ると載っていたようです。

[TypeScript definition?]8https://github.com/PeachScript/vue-infinite-loading/issues/139#issue-307231773)

ただし SSR の下では使えない

デフォルトのデータを読み込み終えると「読み込み終わった」ことを表す。

もちろんカスタム化も可能、適宜コンポーネントを挿入していただければと良さそうです。

<no-ssr>
    <infinite-loading 
        spinner="spiral"
        @infinite="infiniteHandler"
    >
        <span slot="no-more">読み込み終わりました</span>
    </infinite-loading>
</no-ssr>

infiniteHandler() を使って 10 秒後に表示されるようした。

infiniteHandler($state: any) {
    setTimeout(() => {
        if (this.count < this.posts.length) {
            this.count += 9
            $state.loaded()
        } else {
            $state.complete()
        }
    }, 1000)
}

これで無限スクロールが実現できた。

あわせてよみたい..