LoginSignup
0
0

More than 3 years have passed since last update.

Suspenseを自作する

Last updated at Posted at 2020-12-12

始めに

Vue.jsも3系からSuspenseが実装されましたが、今一な点がいくつかありました。

  • コンポーネントとして作らないといけない
  • ページングなど、複数回ローディングすることはできなそう

参考
Vue.js 3.0 の新機能を試す。 〜 Suspense 編〜

そこで自分がやりたいことを満たすようなコンポーネントを自作してみたので、それの備忘録として記事に残します。

自作コンポーネント(SuspensePromise)の機能

Promiseを渡して状態を監視する

以下のようにPromiseをコンポーネントに渡し、状態に応じて表示内容を切り替えられるようにしています。promiseを渡すだけなので、新しくしたらまたローディングの表示ができるようになります。状態の切り替えの際にresolve, rejectで送ったデータも受け取って表示させることができます。

SuspensePromiseの使用例
<template lang="pug">
div
  SuspensePromise(
    :promise="$data.promise"
    :waitTime="100"
  )
    template(#pending)
      p pending...
    template(#resolved="{ data }")
      p resolved, {{ data }}
    template(#rejected="{ data }")
      p rejected, {{ data }}
</template>

実行イメージは以下のような感じです。
Dec-12-2020 10-29-50.gif

pending状態の表示待ち時間を指定できる

こういうローディング系で一番気にしているのが「一瞬ローディングが出てくる」ことです。resolveされるタイミングが早い場合はこういうローディングを出さずにしたいと思って調整しようと思うと、結構大変だと思います。

Dec-12-2020 10-31-12.gif

それをこのコンポーネントでは解消してくれて、waitTimeにpending状態を表示するまでの待ち時間を指定できます。この時間がくる前にresolveされれば、pendingを表示させずにすぐ結果を出すことができます。

Dec-12-2020 10-32-31.gif

終わりに

以上が自作した機能の紹介でした。詳細の実装はCodePenに書いていますので、興味がある方は是非みてください。

See the Pen Suspenseの自作(SuspensePromise) by wintyo (@wintyo) on CodePen.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0