1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Vue.js 3 非同期処理待ちで使えるsuspense要素

Last updated at Posted at 2022-05-15

Vue.js 3 非同期処理待ちで使えるsuspense要素

suspense要素とは

vue.jsを使っていて外部サービスからデータを取ってくる時の非同期処理で待ち時間が発生し、表示が遅くなってしまうことがあります。そのようなときにデータが揃うまで待ち受け画像を表示してくれる機能がsuspense要素です。

suspence要素を使ってみる

非同期処理の待ち時間を擬似的に再現するコードを書き、待ち時間が発生しているときは用意した待受要素が表示されるようにする。

表示側

<div id="app">
  <suspense>
    <template #default>  <!-- データ取得後に表示されるtemplate -->
      <my-component />
    </template>
    <template #fallback> <!--  待受用template -->
      データ取得中...
    </template>
  </suspense>
</div>

表示側は2つのスロットを用意する。

default = 本来表示されるべきtemplate

fallback = 非同期処理待ちの時に表示されるtemplate

vue側

Vue.createApp({})
  .component('my-component', {
    template: '<div>非同期処理が終わりました!</div>',
    setup() {
      return new Promise(resolve => {
        setTimeout(()=> {
          resolve();
        }, 5000); {// ただ5秒待つだけの処理 }
      })
    },
  }).mount('#app')

Vue側の処理では通常通りtemplateを用意します。そして非同期処理をするsetupメソッドを準備しその中でPromiseオブジェクトを返します(実験のため5秒間 待つだけの処理をしています)。これだけで、vueアプリがマウントされた時、#fallbackスロットが表示され、5秒間の処理待ち後、#defaultスロットの配下にあるmy-conponentが表示されます。

suspense機能自体はまだ「実験的」な要素のためこれから変更がかかる可能性があるため本番環境での使用は推奨されていないようですが、便利な機能なため覚えておきたい要素です。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?