Suspense - uma nova feature no Vue3

emanuelgsouza

Emanuel Gonçalves

Posted on February 3, 2020

Suspense - uma nova feature no Vue3

Fala galera, esta é mais uma tradução livre de um artigo do pessoal do Vueschool, dessa vez sobre uma outra feature do Vue 3, que é o componente Suspense. Não deixe de conferir!

Link do post original escrito pelo Filip Rakowski.


Recentemente eu escrevi um artigo sobre as novas features disponíveis no Vue 3 (texto também traduzido) onde eu brevemente introduzi quais features podemos esperar na próxima major release do Vue.js.

No artigo de hoje, eu quero falar um pouco mais sobre uma das mais interessantes - Suspense.

Este artigo é baseado no repositório vue-next. Não há garantia de que os recursos mencionados neste artigo cheguem ao Vue 3 exatamente da forma descrita (mas é provável que aconteça).

O que é o Suspense?

Suspense é um componente especial que renderiza um conteúdo de fallback em vez do seu componente até que uma condição seja atendida. Essa condição geralmente é uma operação assíncrona acontecendo na função setup de seus componentes. Esta é uma técnica bem conhecida do ecossistema React.

Se isso parece estranho para você, não se assuste. Eu vou me aprofundar nisso brevemente.

Com a Composition API, Vue 3 irá introduzir um método setup, que permite conectar diferentes propriedades de componentes com funções como computed() ou onMounted(). Propriedades retornadas pelo método setup estarão disponíveis no template Vue da mesma forma que data, methods, e computeds da Options API do Vue 2 são disponíveis agora.

<template>
  <div> 
    Clicked <b>{{ count }}</b> times. 
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup () {
    const count = ref(0)
    function increment () {
      count.value++
    }    

    return { 
      count,
      increment
    }
}
</script> 
Enter fullscreen mode Exit fullscreen mode

Às vezes você quer realizar uma operação assíncrona no método setup como uma requisição de dados para uma API externa (similarmente ao se faz atualmente no método created).

export default {
  async setup () {
    const user = await fetchUser()
    return { user }    
  }
}
Enter fullscreen mode Exit fullscreen mode

Neste caso, você provavelmente não quer visualizar seu componente enquanto se está buscando os dados do usuário. Você provavelmente quer visualizar algum indicador de loading enquanto se está sendo buscado os dados. É exatamente para isso que o Suspense foi feito!

Se nós encapsulamos o componente abaixo em um Suspense, ele irá mostrar uma conteúdo de fallback enquanto a operação assíncrona do seu componente é resolvida.

<Suspense>
  <template #default>
    <UserProfile />
  </template>
  <template #fallback>
    <div>Loading...</div>
  </template>
</Suspense>
Enter fullscreen mode Exit fullscreen mode

Muito elegante, não? Também podemos suspender o carregamento para vários componentes assíncronos.

Se tivermos outro componente que busca imagens engraçadas de gatos e o coloca junto com o componente UserProfile, o conteúdo de fallback será mostrado até que ambos os componentes resolvam suas operações assíncronas:

<Suspense>
  <template #default>
    <UserProfile />
    <FunnyCats /> 
  </template>
  <template #fallback>
    <div>Loading...</div>
  </template>
</Suspense>
Enter fullscreen mode Exit fullscreen mode

Manipulação de erros

Até agora, cobrimos o que acontece quando as operações assíncronas são resolvidas com êxito, mas o que acontece se elas falharem e forem rejeitadas?

Felizmente, podemos usar o novo hook de ciclo de vida ErrorCaptured para capturar erros como esse e exibir uma mensagem de erro adequada. Veja o exemplo abaixo:

<template>
  <div v-if="error">
   {{ error }}
  </div>
  <Suspense v-else>
    <template #default>
      <UserProfile />
    </template>
    <template #fallback>
      <div>Loading...</div>
    </template>
  </Suspense>
</template>

<script>
import { onErrorCaptured } from 'vue'

setup () {
  const error = ref(null)
  onErrorCaptured(e => {
    error.value = e
    return true
  })}
  return { error }
</script>
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, nós visualizamos um conteúdo de fallback até que a operação assíncrona em UserProfile seja resolvida. Se algo acontece de errado e ela é rejeitada, nós usamos o hook onErrorCaptured do Vue para capturar o erro e passá-lo para uma propriedade error e visualizá-la ao invés do nosso conteúdo de fallback.

Resumo

Suspense é um componente muito acessível que disponibiliza uma maneira fácil e elegante de visualizar um conteúdo de fallback enquanto operações assíncronas são executadas. Com o hook de ciclo de vida ErrorCaptured você também pode graciosamente manipular os erros que acontecem no seu componente "suspendido".


Bom, mais uma tradução finalizada. Espero que tenha gostado. Não deixe de compartilhar este post para que mais pessoas sejam alcançadas por este conhecimento.

Até a próxima!

💖 💪 🙅 🚩
emanuelgsouza
Emanuel Gonçalves

Posted on February 3, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Go async in Vue 3 with Suspense
javascript Go async in Vue 3 with Suspense

June 22, 2020

Suspense - uma nova feature no Vue3
suspense Suspense - uma nova feature no Vue3

February 3, 2020