無限スクロールの話

2019/07/24

v-kansai #8 Short LT

jiyuujin

  • Vue/Nuxt/PHP/Scala/Java/Swift
  • v-kansai/kansai.ts/..
  • Web猫ブログ (webneko.dev)

とある新規案件をやってますが

環境周りの改善を主に

技術スタック

  • Vue CLI v3 (PHP) + TypeScript
  • その他 Jest、Gitlab-CI
  • 基本的には PHP側でレンダリング を行う
  • ビルドによるトランスパイル済みファイルを利用する

纏めれてないのでまたの機会🙏

vue-infinite-loading

使ったことあるひと🙋‍♀️

事前準備

plugins/infinite-loading.ts

import Vue from 'vue'
import InfiniteLoading from 'vue-infinite-loading'

Vue.component('infinite-loading', InfiniteLoading)

型定義

types/shims-vue.d.ts

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;
  }
}

後から気付いたこんなイシューが

https://github.com/PeachScript/vue-infinite-loading/issues/139#issue-307231773

対象データはObjectで保持

コンポーネントでは

最初は 1ページ分を表示

<div
    v-for="(item, index) in responseData"
    :key="item.id"
>
    <div v-if="index < PER_PAGE">
        <!-- コンテンツを表示します -->
    </div>
</div>

no-ssr必須

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

ハンドラをトリガーに

特別な引数の存在

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

基本的にはこれだけ!

是非ご検討くださいませ🙇‍♀️

#9 は FJUGさんと共催!

#2 やります!

Vue Fes前に秋田へ

ご清聴ありがとうございました🙇‍♀️

無限スクロールの話 #v_kansai

By jiyuujin

無限スクロールの話 #v_kansai

Vueプロジェクトで簡単に無限スクロールを実現したい

  • 1,330