vue3で遊んでみたらasync setup()がうまく動かなった

できたもの

f:id:kazuki_nakamura:20200627213546p:plain

作ったもの

todo

toranoana-lab.hatenablog.com

使ったもの

git

github.com

はまった

async setup()が描画されない

  • <Suspense></Suspense>で囲む

vue3から下記のようにsetup関数が使える。

export default defineComponent({
  name: 'HelloWorld',
  setup() {
    const state = reactive<TodoState>({

https://github.com/kajiri-sandbox/vue-typescript/blob/0356e73c6e2b207cfef53d4fa6d5b7854ec40adc/src/components/HelloWorld.vue#L30

setupの中でreactiveを使うと、vue2までのdata(){}のように使えた。 そこまでは良かったが、非同期関数を使いたかったので、setup()をasync setup()に変更したら動かなった。 いろいろ調べた結果、非同期のsetupを使ったコンポーネントを描画するときは、コンポーネントの外側に<Suspense>を定義する必要があった。

<template>
  <Suspense>
    <HelloWorld/>
  </Suspense>
</template>

https://github.com/kajiri-sandbox/vue-typescript/blob/0356e73c6e2b207cfef53d4fa6d5b7854ec40adc/src/App.vue#L4

これで動いたので良かった。

雑記

他にも、setup(){}の中で、computedとかvue2のやつ使えて便利そうだった。 template以下に要素を2つ以上追加できるようになったのでそれもうれしい。

<template\>
   <div></div>
   <div></div>
</template\>

早くこないかな :)

参考にさせていただきました

qiita.com

speakerdeck.com

qiita.com