То, что вы пишете, это точно composables?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет! В этой статье c помощью простого чек листа за пару шагов выясним, являются ли функции, которые вы пишете в своем vue коде, настоящими composables.

Согласно документации, composables это функции, которые благодаря использованию внутри себя composition API, инкапсулируют и переиспользуют логику, в работе которой задействовано состояние приложения (локальное или глобальное).

Если ваша функция принимает на вход определенные числа и возвращает наименьшее значение из них, то у такой функции нет работы с состоянием, а значит это не может называться composable, в действительности это функция утилита.

function minValue(...args) {
    const min = args.reduce((acc, val) => {
        return acc < val ? acc : val;
    });
    return min;
}

С другой стороны, если ваша функция манипулирует состоянием (будь то состояние внутреннее или глобальное), совершает внешние взаимодействия для того чтобы это состояние заполнить (фечинг, Intersection Observer, манипуляции с DOM), то она, безусловно, является подлинным composable и ее название следует начинать c use

function useMenu(gqlClient: GqlClient) {
    const isLoading = ref(false);
    const menuItems = ref<MenuSectionItem[]>([]);

    function setSectionItem(item: Section): SectionItem {...}

    async function fetchMenuItemList() {
      const result = await gqlClient.query(getMenuQuery());
      ...
      menuItems.value = result.items;
    }
}

✏️ Чеклист для определения Vue composable

Лишь одного в попадания в пункт будет достаточно, чтобы пройти тест, вам не нужно попадать во все три.

  1. Ваша функция внутри себя использует методы жизненного цикла.

function useInterval(cb: () => void, interval = 1000) {
  let timer: ReturnType<typeof setInterval> | null = null

  function clean() {
    if (timer) {
      clearInterval(timer)
      timer = null
    }
  }

  onMounted(() => {
    if (interval <= 0) return;
  
    timer = setInterval(cb, interval)
  })
  
  onBeforeUnmount(() => {
    clean()
  })
}

Функция выше не манипулирует с состоянием, но по-прежнему является composable, потому что использует методы жизненного цикла компонента. Она удовлетворяет первому пункту.

  1. Ваша функция внутри себя использует другие composables. Конечно, вы вполне можете выстраивать композицию из composable функций, и если единственная работа функции заключается в том, чтобы внутри себя вызвать другую composable функцию, то она тоже является таковой без исключений. Например, функция может использовать внутри себя написанный вами useFetch , использовать useSomething из библиотеки vue-use и тому подобное.

function useScreenInitialize() {
    const { x, y } = useMouse()
    // возможна дополнительная логика
    return [x, y]
}
  1. У вашей функции есть логика работы с состоянием (stateful logic). Чаще всего это работа с ref, который хранит определенное состояние, и изменение или преобразование этого состояния происходит в функции.

function useUser (gqlClient: GqlClient) {
  const user = ref(null)
  const userPreferences = computed(() => user.value?.preferences ?? [])

  async function fetchUser () {
    user.value = await gqlClient.query(getUserQuery())
  }
  // больше логики опционально

  return {
    user: readonly(user),
    fetchUser,
    userPreferences
  }
}

Итог

Composables - это функции на composition API, которые переиспользуют логику с методами жизненного цикла, другими composables и/или хранят и преобразуют состояние.

✌️ Всегда рад предложениям и обратной связи - bronnikovmb@gmail.com

Источник: https://habr.com/ru/articles/805491/


Интересные статьи

Интересные статьи

Моя история Мне досталась лента с готовой версией игры Frogger 2: Swampy's Revenge. В детстве я очень любил эту серию игр. Считалось, что эта лента — единственная резервная копия исходного кода ...
Новый эксперимент пролил свет на ключевое событие в эволюции жизни на планете Земля: как именно это произошёл эволюционный переход от одноклеточных к многоклеточным формам жизни. Несмотря на то, что, ...
11 марта исполнилось 10 лет со дня Великого японского землетрясения. Оно произошло у северо-восточного берега острова Хонсю, достигало силы 9 баллов по шкале Рихтера и надолго останется в...
В октябре мы стартовали курс Android Academy Fundamentals, на который зарегистрировалось более 1500 слушателей. Основные занятия уже прошли, но на десерт осталось три веб...
По долгу службы я взяла интервью у человека, много лет занимающегося исследованиями рынка, трендов разработки ПО и ИТ-услуг в Центральной и Восточной Европе, из них 15 — и в России. И хотя самое ...