Русский

Глубокое изучение Composition API во Vue.js 3. Научитесь создавать повторно используемые, поддерживаемые и тестируемые приложения на Vue.js с практическими примерами и лучшими практиками для разработчиков со всего мира.

Composition API в Vue.js 3: Глубокое погружение для глобальных разработчиков

Vue.js быстро стал популярным выбором для создания современных веб-приложений благодаря своей доступной кривой обучения и мощным функциям. Vue.js 3 идет дальше, представляя Composition API — новый способ организации логики компонентов. Это глубокое погружение представляет собой всеобъемлющее руководство по пониманию и эффективному использованию Composition API, вооружая вас навыками для создания более поддерживаемых, повторно используемых и тестируемых приложений на Vue.

Что такое Composition API?

Composition API — это набор API, который позволяет нам создавать компоненты Vue, используя импортируемые функции вместо объявления опций. По сути, он позволяет группировать связанную логику вместе, независимо от того, где она появляется в шаблоне. Это контрастирует с Options API (data, methods, computed, watch), который заставляет вас организовывать код на основе этих предопределенных категорий. Думайте об Options API как об организации вашего кода по тому, *чем* он является (данные, метод и т.д.), в то время как Composition API позволяет вам организовывать код по тому, *что он делает*.

Ядро Composition API вращается вокруг функции setup(). Эта функция является точкой входа для использования Composition API внутри компонента. Внутри setup() вы можете определять реактивное состояние, вычисляемые свойства, методы и хуки жизненного цикла, используя композируемые функции.

Зачем использовать Composition API?

Composition API предлагает несколько преимуществ по сравнению с традиционным Options API, особенно для более крупных и сложных приложений:

Понимание ключевых концепций

Давайте погрузимся в ключевые концепции, лежащие в основе Composition API:

1. setup()

Как упоминалось ранее, setup() — это точка входа для использования Composition API. Это опция компонента, которая выполняется до его создания. Внутри setup() вы определяете реактивное состояние, вычисляемые свойства, методы и хуки жизненного цикла, а затем возвращаете объект, содержащий значения, которые вы хотите сделать доступными для шаблона.

Пример:

import { ref } from 'vue'

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

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

    return {
      count,
      increment
    }
  }
}

В этом примере мы используем ref для создания реактивной переменной с именем count. Мы также определяем метод с именем increment, который увеличивает значение count. Наконец, мы возвращаем объект, содержащий count и increment, что делает их доступными в шаблоне компонента.

2. Реактивное состояние с помощью ref и reactive

Composition API предоставляет две основные функции для создания реактивного состояния: ref и reactive.

Пример использования ref:

import { ref } from 'vue'

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

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

    return {
      message,
      updateMessage
    }
  }
}

Пример использования 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. Вычисляемые свойства с помощью computed

Вычисляемые свойства — это значения, которые выводятся из другого реактивного состояния. Они автоматически обновляются при изменении их зависимостей. Функция computed принимает в качестве аргумента геттер-функцию и возвращает реактивный ref-объект только для чтения.

Пример:

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

В этом примере fullName — это вычисляемое свойство, которое зависит от firstName и lastName. При изменении firstName или lastName fullName будет автоматически обновляться.

4. Наблюдатели с помощью watch и watchEffect

Наблюдатели (watchers) позволяют реагировать на изменения в реактивном состоянии. The Composition API предоставляет два основных способа создания наблюдателей: watch и watchEffect.

Пример использования 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
    }
  }
}

Пример использования 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. Хуки жизненного цикла

Composition API предоставляет доступ к хукам жизненного цикла компонента через функции, которые начинаются с on, такие как onMounted, onUpdated и onUnmounted. Эти функции принимают в качестве аргумента колбэк, который будет выполнен при срабатывании соответствующего хука жизненного цикла.

Пример:

import { onMounted, onUnmounted } from 'vue'

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

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

    return {}
  }
}

Создание композируемых функций

Настоящая мощь Composition API заключается в возможности создавать повторно используемые композируемые функции. Композируемая функция — это просто функция, которая инкапсулирует часть логики компонента и возвращает реактивное состояние и функции, которые можно использовать в нескольких компонентах.

Пример: Давайте создадим композируемую функцию, которая отслеживает положение мыши:

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

Теперь вы можете использовать эту композируемую функцию в любом компоненте:

import { useMousePosition } from './useMousePosition'

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

    return {
      x,
      y
    }
  }
}

Практические примеры и сценарии использования

Давайте рассмотрим несколько практических примеров того, как Composition API можно использовать в реальных сценариях:

1. Получение данных

Создание композируемой функции для получения данных из API — это распространенный сценарий использования. Это позволяет повторно использовать одну и ту же логику получения данных в нескольких компонентах.

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

Затем вы можете использовать эту композируемую функцию в своих компонентах следующим образом:

import { useFetch } from './useFetch'

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

    return {
      data,
      error,
      loading
    }
  }
}

2. Валидация форм

Валидация форм — это еще одна область, где Composition API может быть очень полезен. Вы можете создавать композируемые функции, которые инкапсулируют логику валидации и повторно использовать их в разных формах.

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' && !/^[^\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(value)) {
        error = 'Invalid email format'
        break
      }
    }

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

  return {
    errors,
    validateField
  }
}

Использование в компоненте:

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. Управление аутентификацией пользователей

Логика аутентификации часто может быть сложной и дублироваться в нескольких компонентах. Composition API позволяет создать композируемую функцию, которая инкапсулирует всю логику аутентификации и предоставляет чистый API для использования вашими компонентами.

Пример: (Упрощенный)

import { ref } from 'vue'

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

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

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

  return {
    isLoggedIn,
    user,
    login,
    logout
  }
}

Лучшие практики использования Composition API

Чтобы извлечь максимальную пользу из Composition API, придерживайтесь следующих лучших практик:

Распространенные ошибки и как их избежать

Хотя Composition API предлагает много преимуществ, существуют также некоторые распространенные ошибки, о которых следует знать:

Composition API и глобальные команды

Composition API способствует сотрудничеству в глобальных командах разработчиков, продвигая:

Заключение

Composition API во Vue.js 3 — это мощный инструмент, который может значительно улучшить организацию, возможность повторного использования и тестируемость ваших приложений Vue. Понимая ключевые концепции и следуя лучшим практикам, изложенным в этом глубоком погружении, вы сможете использовать Composition API для создания более поддерживаемых и масштабируемых приложений для глобальной аудитории. Примите Composition API и раскройте весь потенциал Vue.js 3.

Мы призываем вас экспериментировать с Composition API в ваших собственных проектах и исследовать огромные возможности, которые он предлагает. Удачного кодирования!