Português

Explore a Composition API do Vue.js 3 a fundo. Aprenda a criar aplicações Vue.js reutilizáveis, sustentáveis e testáveis com exemplos práticos e melhores práticas para desenvolvedores globais.

Composition API do Vue.js 3: Um Mergulho Profundo para Desenvolvedores Globais

O Vue.js tornou-se rapidamente uma escolha popular para a construção de aplicações web modernas, graças à sua curva de aprendizagem acessível e aos seus recursos poderosos. O Vue.js 3 leva isso adiante com a introdução da Composition API, uma nova maneira de organizar a lógica dos seus componentes. Este mergulho profundo oferece um guia completo para entender e utilizar a Composition API de forma eficaz, equipando-o com as competências para construir aplicações Vue mais sustentáveis, reutilizáveis e testáveis.

O que é a Composition API?

A Composition API é um conjunto de APIs que nos permite criar componentes Vue usando funções importadas em vez de declarar opções. Essencialmente, ela permite agrupar lógicas relacionadas, independentemente de onde aparecem no template. Isso contrasta com a Options API (data, methods, computed, watch), que o força a organizar o código com base nessas categorias predefinidas. Pense na Options API como uma forma de organizar o seu código por *o que é* (dados, método, etc.), enquanto a Composition API permite organizar o código por *o que ele faz*.

O núcleo da Composition API gira em torno da função setup(). Esta função é o ponto de entrada para utilizar a Composition API dentro de um componente. Dentro de setup(), pode definir o estado reativo, propriedades computadas, métodos e hooks de ciclo de vida usando funções de composição (composable functions).

Por que usar a Composition API?

A Composition API oferece várias vantagens sobre a Options API tradicional, particularmente para aplicações maiores e mais complexas:

Entendendo os Conceitos Centrais

Vamos mergulhar nos conceitos-chave que sustentam a Composition API:

1. setup()

Como mencionado anteriormente, setup() é o ponto de entrada para usar a Composition API. É uma opção de componente que é executada antes da criação do componente. Dentro de setup(), você define o estado reativo, propriedades computadas, métodos e hooks de ciclo de vida, e então retorna um objeto contendo os valores que deseja expor ao template.

Exemplo:

import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

Neste exemplo, estamos usando ref para criar uma variável reativa chamada count. Também definimos um método chamado increment que aumenta o valor de count. Finalmente, retornamos um objeto contendo count e increment, o que os torna disponíveis no template do componente.

2. Estado Reativo com ref e reactive

A Composition API fornece duas funções principais para criar estado reativo: ref e reactive.

Exemplo usando ref:

import { ref } from 'vue'

export default {
  setup() {
    const message = ref('Olá, Vue!')

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

Exemplo usando reactive:

import { reactive } from 'vue'

export default {
  setup() {
    const state = reactive({
      name: 'John Doe',
      age: 30
    })

    const updateName = (newName) => {
      state.name = newName
    }

    return {
      state,
      updateName
    }
  }
}

3. Propriedades Computadas com computed

Propriedades computadas são valores derivados de outro estado reativo. Elas são atualizadas automaticamente sempre que suas dependências mudam. A função computed recebe uma função getter como argumento e retorna um ref reativo de somente leitura.

Exemplo:

import { ref, computed } from 'vue'

export default {
  setup() {
    const firstName = ref('John')
    const lastName = ref('Doe')

    const fullName = computed(() => {
      return `${firstName.value} ${lastName.value}`
    })

    return {
      firstName,
      lastName,
      fullName
    }
  }
}

Neste exemplo, fullName é uma propriedade computada que depende de firstName e lastName. Sempre que firstName ou lastName mudar, fullName será atualizado automaticamente.

4. Observadores com watch e watchEffect

Observadores (Watchers) permitem que você reaja a mudanças no estado reativo. A Composition API fornece duas maneiras principais de criar observadores: watch e watchEffect.

Exemplo usando watch:

import { ref, watch } from 'vue'

export default {
  setup() {
    const count = ref(0)

    watch(
      count,
      (newValue, oldValue) => {
        console.log(`Contagem mudou de ${oldValue} para ${newValue}`)
      }
    )

    const increment = () => {
      count.value++
    }

    return {
      count,
      increment
    }
  }
}

Exemplo usando watchEffect:

import { ref, watchEffect } from 'vue'

export default {
  setup() {
    const message = ref('Olá')

    watchEffect(() => {
      console.log(`A mensagem é: ${message.value}`)
    })

    const updateMessage = (newMessage) => {
      message.value = newMessage
    }

    return {
      message,
      updateMessage
    }
  }
}

5. Hooks de Ciclo de Vida

A Composition API fornece acesso aos hooks de ciclo de vida do componente através de funções que começam com on, como onMounted, onUpdated e onUnmounted. Essas funções recebem um callback como argumento, que será executado quando o hook de ciclo de vida correspondente for acionado.

Exemplo:

import { onMounted, onUnmounted } from 'vue'

export default {
  setup() {
    onMounted(() => {
      console.log('Componente foi montado')
    })

    onUnmounted(() => {
      console.log('Componente foi desmontado')
    })

    return {}
  }
}

Criando Funções de Composição (Composables)

O verdadeiro poder da Composition API vem da capacidade de criar funções de composição reutilizáveis. Uma função de composição é simplesmente uma função que encapsula uma parte da lógica do componente e retorna estado reativo e funções que podem ser usadas em múltiplos componentes.

Exemplo: Vamos criar uma função de composição que rastreia a posição do mouse:

import { ref, onMounted, onUnmounted } from 'vue'

export function useMousePosition() {
  const x = ref(0)
  const y = ref(0)

  const updatePosition = (event) => {
    x.value = event.clientX
    y.value = event.clientY
  }

  onMounted(() => {
    window.addEventListener('mousemove', updatePosition)
  })

  onUnmounted(() => {
    window.removeEventListener('mousemove', updatePosition)
  })

  return {
    x,
    y
  }
}

Agora, você pode usar esta função de composição em qualquer componente:

import { useMousePosition } from './useMousePosition'

export default {
  setup() {
    const { x, y } = useMousePosition()

    return {
      x,
      y
    }
  }
}

Exemplos Práticos e Casos de Uso

Vamos explorar alguns exemplos práticos de como a Composition API pode ser usada em cenários do mundo real:

1. Busca de Dados (Data Fetching)

Criar uma função de composição para buscar dados de uma API é um caso de uso comum. Isso permite que você reutilize a mesma lógica de busca de dados em vários componentes.

import { ref, onMounted } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)
  const loading = ref(true)

  onMounted(async () => {
    try {
      const response = await fetch(url)
      data.value = await response.json()
    } catch (err) {
      error.value = err
    } finally {
      loading.value = false
    }
  })

  return {
    data,
    error,
    loading
  }
}

Você pode então usar esta função de composição em seus componentes assim:

import { useFetch } from './useFetch'

export default {
  setup() {
    const { data, error, loading } = useFetch('https://api.example.com/data')

    return {
      data,
      error,
      loading
    }
  }
}

2. Validação de Formulários

A validação de formulários é outra área onde a Composition API pode ser muito útil. Você pode criar funções de composição que encapsulam a lógica de validação e reutilizá-las em diferentes formulários.

import { ref } from 'vue'

export function useValidation() {
  const errors = ref({})

  const validateField = (fieldName, value, rules) => {
    let error = null
    for (const rule of rules) {
      if (rule === 'required' && !value) {
        error = 'Este campo é obrigatório'
        break
      } else if (rule === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
        error = 'Formato de email inválido'
        break
      }
    }

    if (error) {
      errors.value[fieldName] = error
    } else {
      delete errors.value[fieldName]
    }
  }

  return {
    errors,
    validateField
  }
}

Uso em um componente:

import { useValidation } from './useValidation'
import { ref } from 'vue'

export default {
  setup() {
    const { errors, validateField } = useValidation()
    const email = ref('')

    const validateEmail = () => {
      validateField('email', email.value, ['required', 'email'])
    }

    return {
      email,
      errors,
      validateEmail
    }
  }
}

3. Gerenciamento de Autenticação de Usuário

A lógica de autenticação pode ser frequentemente complexa e duplicada em vários componentes. A Composition API permite que você crie uma função de composição que encapsula toda a lógica de autenticação e fornece uma API limpa para seus componentes usarem.

Exemplo: (Simplificado)

import { ref } from 'vue'

export function useAuth() {
  const isLoggedIn = ref(false)
  const user = ref(null)

  const login = async (username, password) => {
    // Simula chamada de API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = true
    user.value = { username }
  }

  const logout = async () => {
    // Simula chamada de API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = false
    user.value = null
  }

  return {
    isLoggedIn,
    user,
    login,
    logout
  }
}

Melhores Práticas para Usar a Composition API

Para aproveitar ao máximo a Composition API, considere as seguintes melhores práticas:

Armadilhas Comuns e Como Evitá-las

Embora a Composition API ofereça muitos benefícios, também existem algumas armadilhas comuns das quais se deve estar ciente:

A Composition API e Equipes Globais

A Composition API promove a colaboração em equipes de desenvolvimento globais, incentivando:

Conclusão

A Composition API do Vue.js 3 é uma ferramenta poderosa que pode melhorar significativamente a organização, a reutilização e a testabilidade de suas aplicações Vue. Ao entender os conceitos centrais e seguir as melhores práticas descritas neste mergulho profundo, você pode aproveitar a Composition API para construir aplicações mais sustentáveis e escaláveis para uma audiência global. Abrace a Composition API e desbloqueie todo o potencial do Vue.js 3.

Nós o encorajamos a experimentar a Composition API em seus próprios projetos e a explorar as vastas possibilidades que ela oferece. Bom código!

Composition API do Vue.js 3: Um Mergulho Profundo para Desenvolvedores Globais | MLOG