Polski

Poznaj dogłębnie Composition API w Vue.js 3. Dowiedz się, jak budować reużywalne, łatwe w utrzymaniu i testowalne aplikacje Vue z praktycznymi przykładami.

Vue.js 3 Composition API: Dogłębna analiza dla globalnych deweloperów

Vue.js szybko stał się popularnym wyborem do tworzenia nowoczesnych aplikacji internetowych, dzięki przystępnej krzywej uczenia się i potężnym funkcjom. Vue.js 3 idzie o krok dalej, wprowadzając Composition API – nowy sposób na organizację logiki komponentów. Ta dogłębna analiza stanowi kompleksowy przewodnik po zrozumieniu i efektywnym wykorzystaniu Composition API, wyposażając Cię w umiejętności niezbędne do tworzenia łatwiejszych w utrzymaniu, reużywalnych i testowalnych aplikacji Vue.

Czym jest Composition API?

Composition API to zestaw interfejsów API, które pozwalają nam tworzyć komponenty Vue przy użyciu importowanych funkcji zamiast deklarowania opcji. W gruncie rzeczy, pozwala grupować powiązaną logikę razem, niezależnie od tego, gdzie pojawia się ona w szablonie. Kontrastuje to z Options API (data, methods, computed, watch), które zmusza do organizowania kodu w oparciu o te predefiniowane kategorie. Pomyśl o Options API jako o organizacji kodu według tego, czym on jest (danymi, metodą itp.), podczas gdy Composition API pozwala organizować kod według tego, co robi.

Rdzeń Composition API obraca się wokół funkcji setup(). Jest to punkt wejścia do korzystania z Composition API wewnątrz komponentu. W setup() można definiować reaktywny stan, właściwości obliczeniowe, metody i haki cyklu życia za pomocą funkcji kompozycyjnych.

Dlaczego warto używać Composition API?

Composition API oferuje kilka zalet w porównaniu z tradycyjnym Options API, szczególnie w przypadku większych i bardziej złożonych aplikacji:

Zrozumienie podstawowych koncepcji

Zgłębmy kluczowe koncepcje, na których opiera się Composition API:

1. setup()

Jak wspomniano wcześniej, setup() jest punktem wejścia do korzystania z Composition API. Jest to opcja komponentu, która jest wykonywana przed jego utworzeniem. Wewnątrz setup() definiuje się reaktywny stan, właściwości obliczeniowe, metody i haki cyklu życia, a następnie zwraca obiekt zawierający wartości, które mają być udostępnione w szablonie.

Przykład:

import { ref } from 'vue'

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

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

    return {
      count,
      increment
    }
  }
}

W tym przykładzie używamy ref do stworzenia reaktywnej zmiennej o nazwie count. Definiujemy również metodę o nazwie increment, która zwiększa wartość count. Na koniec zwracamy obiekt zawierający count i increment, co udostępnia je w szablonie komponentu.

2. Stan reaktywny z ref i reactive

Composition API dostarcza dwie podstawowe funkcje do tworzenia stanu reaktywnego: ref i reactive.

Przykład z użyciem ref:

import { ref } from 'vue'

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

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

    return {
      message,
      updateMessage
    }
  }
}

Przykład z użyciem reactive:

import { reactive } from 'vue'

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

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

    return {
      state,
      updateName
    }
  }
}

3. Właściwości obliczeniowe z computed

Właściwości obliczeniowe to wartości, które są pochodnymi innego stanu reaktywnego. Są one automatycznie aktualizowane, gdy tylko zmienią się ich zależności. Funkcja computed przyjmuje jako argument funkcję getter i zwraca reaktywny, tylko do odczytu obiekt ref.

Przykład:

import { ref, computed } from 'vue'

export default {
  setup() {
    const firstName = ref('Jan')
    const lastName = ref('Kowalski')

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

    return {
      firstName,
      lastName,
      fullName
    }
  }
}

W tym przykładzie fullName jest właściwością obliczeniową, która zależy od firstName i lastName. Za każdym razem, gdy firstName lub lastName ulegnie zmianie, fullName zostanie automatycznie zaktualizowane.

4. Obserwatory (watchers) z watch i watchEffect

Obserwatory pozwalają reagować na zmiany w stanie reaktywnym. Composition API oferuje dwa główne sposoby tworzenia obserwatorów: watch i watchEffect.

Przykład z użyciem watch:

import { ref, watch } from 'vue'

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

    watch(
      count,
      (newValue, oldValue) => {
        console.log(`Licznik zmienił się z ${oldValue} na ${newValue}`)
      }
    )

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

    return {
      count,
      increment
    }
  }
}

Przykład z użyciem watchEffect:

import { ref, watchEffect } from 'vue'

export default {
  setup() {
    const message = ref('Witaj')

    watchEffect(() => {
      console.log(`Wiadomość to: ${message.value}`)
    })

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

    return {
      message,
      updateMessage
    }
  }
}

5. Haki cyklu życia

Composition API zapewnia dostęp do haków cyklu życia komponentu za pomocą funkcji zaczynających się od on, takich jak onMounted, onUpdated i onUnmounted. Funkcje te przyjmują jako argument funkcję zwrotną, która zostanie wykonana, gdy odpowiedni hak cyklu życia zostanie wywołany.

Przykład:

import { onMounted, onUnmounted } from 'vue'

export default {
  setup() {
    onMounted(() => {
      console.log('Komponent został zamontowany')
    })

    onUnmounted(() => {
      console.log('Komponent został odmontowany')
    })

    return {}
  }
}

Tworzenie funkcji kompozycyjnych (Composable Functions)

Prawdziwa siła Composition API tkwi w możliwości tworzenia reużywalnych funkcji kompozycyjnych. Funkcja kompozycyjna to po prostu funkcja, która hermetyzuje fragment logiki komponentu i zwraca reaktywny stan oraz funkcje, które mogą być używane w wielu komponentach.

Przykład: Stwórzmy funkcję kompozycyjną, która śledzi pozycję myszy:

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

Teraz możesz użyć tej funkcji kompozycyjnej w dowolnym komponencie:

import { useMousePosition } from './useMousePosition'

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

    return {
      x,
      y
    }
  }
}

Praktyczne przykłady i przypadki użycia

Przyjrzyjmy się kilku praktycznym przykładom, jak Composition API może być używane w rzeczywistych scenariuszach:

1. Pobieranie danych

Tworzenie funkcji kompozycyjnej do pobierania danych z API jest częstym przypadkiem użycia. Pozwala to na ponowne wykorzystanie tej samej logiki pobierania danych w wielu komponentach.

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

Następnie można użyć tej funkcji kompozycyjnej w swoich komponentach w ten sposób:

import { useFetch } from './useFetch'

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

    return {
      data,
      error,
      loading
    }
  }
}

2. Walidacja formularzy

Walidacja formularzy to kolejny obszar, w którym Composition API może być bardzo pomocne. Można tworzyć funkcje kompozycyjne, które hermetyzują logikę walidacji i używać ich ponownie w różnych formularzach.

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 = 'To pole jest wymagane'
        break
      } else if (rule === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
        error = 'Nieprawidłowy format adresu e-mail'
        break
      }
    }

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

  return {
    errors,
    validateField
  }
}

Użycie w komponencie:

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. Zarządzanie uwierzytelnianiem użytkownika

Logika uwierzytelniania może być często złożona i powielana w wielu komponentach. Composition API pozwala stworzyć funkcję kompozycyjną, która hermetyzuje całą logikę uwierzytelniania i zapewnia czyste API do użytku w komponentach.

Przykład: (Uproszczony)

import { ref } from 'vue'

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

  const login = async (username, password) => {
    // Symulacja wywołania API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = true
    user.value = { username }
  }

  const logout = async () => {
    // Symulacja wywołania API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = false
    user.value = null
  }

  return {
    isLoggedIn,
    user,
    login,
    logout
  }
}

Najlepsze praktyki korzystania z Composition API

Aby w pełni wykorzystać Composition API, warto rozważyć następujące najlepsze praktyki:

Częste pułapki i jak ich unikać

Chociaż Composition API oferuje wiele korzyści, istnieje również kilka częstych pułapek, na które należy uważać:

Composition API a globalne zespoły

Composition API sprzyja współpracy w ramach globalnych zespołów deweloperskich poprzez promowanie:

Podsumowanie

Vue.js 3 Composition API to potężne narzędzie, które może znacznie poprawić organizację, reużywalność i testowalność Twoich aplikacji Vue. Rozumiejąc podstawowe koncepcje i postępując zgodnie z najlepszymi praktykami opisanymi w tej dogłębnej analizie, możesz wykorzystać Composition API do tworzenia łatwiejszych w utrzymaniu i skalowalnych aplikacji dla globalnej publiczności. Odkryj Composition API i uwolnij pełny potencjał Vue.js 3.

Zachęcamy do eksperymentowania z Composition API we własnych projektach i odkrywania ogromnych możliwości, jakie oferuje. Miłego kodowania!

Vue.js 3 Composition API: Dogłębna analiza dla globalnych deweloperów | MLOG