Română

Explorați în detaliu Composition API din Vue.js 3. Construiți aplicații Vue reutilizabile, mentenabile și testabile cu exemple practice pentru dezvoltatori globali.

Vue.js 3 Composition API: O Analiză Aprofundată pentru Dezvoltatori Globali

Vue.js a devenit rapid o alegere populară pentru construirea aplicațiilor web moderne, datorită curbei sale de învățare accesibile și a funcționalităților puternice. Vue.js 3 duce acest lucru mai departe prin introducerea Composition API, un nou mod de a organiza logica componentelor. Această analiză aprofundată oferă un ghid complet pentru înțelegerea și utilizarea eficientă a Composition API, echipându-vă cu abilitățile necesare pentru a construi aplicații Vue mai ușor de întreținut, reutilizabile și testabile.

Ce este Composition API?

Composition API este un set de API-uri care ne permit să creăm componente Vue folosind funcții importate în loc de a declara opțiuni. În esență, vă permite să grupați logica aferentă, indiferent de locul în care apare în șablon. Acest lucru contrastează cu Options API (data, methods, computed, watch), care vă forțează să organizați codul pe baza acestor categorii predefinite. Gândiți-vă la Options API ca la organizarea codului după ce este (date, metodă etc.), în timp ce Composition API vă permite să organizați codul după ceea ce face.

Esența Composition API se învârte în jurul funcției setup(). Această funcție este punctul de intrare pentru utilizarea Composition API într-o componentă. În interiorul setup(), puteți defini stări reactive, proprietăți calculate, metode și hook-uri de ciclu de viață folosind funcții compozabile.

De ce să folosim Composition API?

Composition API oferă mai multe avantaje față de tradiționalul Options API, în special pentru aplicațiile mai mari și mai complexe:

Înțelegerea conceptelor de bază

Să aprofundăm conceptele cheie care stau la baza Composition API:

1. setup()

După cum am menționat anterior, setup() este punctul de intrare pentru utilizarea Composition API. Este o opțiune de componentă care se execută înainte ca componenta să fie creată. În interiorul setup(), definiți stări reactive, proprietăți calculate, metode și hook-uri de ciclu de viață, apoi returnați un obiect care conține valorile pe care doriți să le expuneți șablonului.

Exemplu:

import { ref } from 'vue'

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

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

    return {
      count,
      increment
    }
  }
}

În acest exemplu, folosim ref pentru a crea o variabilă reactivă numită count. De asemenea, definim o metodă numită increment care mărește valoarea lui count. În cele din urmă, returnăm un obiect care conține count și increment, ceea ce le face disponibile în șablonul componentei.

2. Stare reactivă cu ref și reactive

Composition API oferă două funcții de bază pentru crearea stării reactive: ref și reactive.

Exemplu folosind ref:

import { ref } from 'vue'

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

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

    return {
      message,
      updateMessage
    }
  }
}

Exemplu folosind 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. Proprietăți calculate cu computed

Proprietățile calculate sunt valori derivate din altă stare reactivă. Acestea sunt actualizate automat ori de câte ori dependențele lor se modifică. Funcția computed preia o funcție getter ca argument și returnează un ref reactiv doar pentru citire.

Exemplu:

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

În acest exemplu, fullName este o proprietate calculată care depinde de firstName și lastName. Ori de câte ori firstName sau lastName se modifică, fullName va fi actualizat automat.

4. Observatori (Watchers) cu watch și watchEffect

Observatorii vă permit să reacționați la modificările stării reactive. Composition API oferă două modalități principale de a crea observatori: watch și watchEffect.

Exemplu folosind watch:

import { ref, watch } from 'vue'

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

    watch(
      count,
      (newValue, oldValue) => {
        console.log(`Count changed from ${oldValue} to ${newValue}`)
      }
    )

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

    return {
      count,
      increment
    }
  }
}

Exemplu folosind watchEffect:

import { ref, watchEffect } from 'vue'

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

    watchEffect(() => {
      console.log(`Message is: ${message.value}`)
    })

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

    return {
      message,
      updateMessage
    }
  }
}

5. Hook-uri de ciclu de viață

Composition API oferă acces la hook-urile de ciclu de viață ale componentelor prin funcții care încep cu on, cum ar fi onMounted, onUpdated și onUnmounted. Aceste funcții preiau un callback ca argument, care va fi executat atunci când hook-ul corespunzător este declanșat.

Exemplu:

import { onMounted, onUnmounted } from 'vue'

export default {
  setup() {
    onMounted(() => {
      console.log('Component is mounted')
    })

    onUnmounted(() => {
      console.log('Component is unmounted')
    })

    return {}
  }
}

Crearea de funcții compozabile

Adevărata putere a Composition API vine din abilitatea de a crea funcții compozabile reutilizabile. O funcție compozabilă este pur și simplu o funcție care încapsulează o bucată de logică a componentei și returnează stări și funcții reactive care pot fi utilizate în mai multe componente.

Exemplu: Să creăm o funcție compozabilă care urmărește poziția mouse-ului:

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

Acum, puteți utiliza această funcție compozabilă în orice componentă:

import { useMousePosition } from './useMousePosition'

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

    return {
      x,
      y
    }
  }
}

Exemple practice și cazuri de utilizare

Să explorăm câteva exemple practice despre cum poate fi utilizat Composition API în scenarii din lumea reală:

1. Preluarea datelor

Crearea unei funcții compozabile pentru preluarea datelor dintr-un API este un caz de utilizare comun. Acest lucru vă permite să reutilizați aceeași logică de preluare a datelor în mai multe componente.

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

Puteți utiliza apoi această funcție compozabilă în componentele dvs. astfel:

import { useFetch } from './useFetch'

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

    return {
      data,
      error,
      loading
    }
  }
}

2. Validarea formularelor

Validarea formularelor este un alt domeniu în care Composition API poate fi foarte util. Puteți crea funcții compozabile care încapsulează logica de validare și le puteți refolosi în diferite formulare.

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 = 'This field is required'
        break
      } else if (rule === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
        error = 'Invalid email format'
        break
      }
    }

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

  return {
    errors,
    validateField
  }
}

Utilizare într-o componentă:

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. Gestionarea autentificării utilizatorilor

Logica de autentificare poate fi adesea complexă și duplicată în mai multe componente. Composition API vă permite să creați o funcție compozabilă care încapsulează toată logica de autentificare și oferă un API curat pe care componentele dvs. să îl utilizeze.

Exemplu: (Simplificat)

import { ref } from 'vue'

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

  const login = async (username, password) => {
    // Simulează un apel API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = true
    user.value = { username }
  }

  const logout = async () => {
    // Simulează un apel API
    await new Promise(resolve => setTimeout(resolve, 1000))
    isLoggedIn.value = false
    user.value = null
  }

  return {
    isLoggedIn,
    user,
    login,
    logout
  }
}

Cele mai bune practici pentru utilizarea Composition API

Pentru a profita la maximum de Composition API, luați în considerare următoarele bune practici:

Capcane comune și cum să le evitați

Deși Composition API oferă multe beneficii, există și câteva capcane comune de care trebuie să fiți conștienți:

Composition API și Echipele Globale

Composition API încurajează colaborarea în cadrul echipelor de dezvoltare globale prin promovarea:

Concluzie

Composition API din Vue.js 3 este un instrument puternic care poate îmbunătăți semnificativ organizarea, reutilizabilitatea și testabilitatea aplicațiilor dvs. Vue. Înțelegând conceptele de bază și urmând cele mai bune practici prezentate în această analiză aprofundată, puteți valorifica Composition API pentru a construi aplicații mai mentenabile și scalabile pentru un public global. Adoptați Composition API și deblocați întregul potențial al Vue.js 3.

Vă încurajăm să experimentați cu Composition API în propriile proiecte și să explorați posibilitățile vaste pe care le oferă. Spor la codat!