10 промтов для Vue.js и Nuxt: от компонентов до Pinia store

Введение

Vue.js и Nuxt — одни из самых популярных фреймворков для создания современных веб-приложений. Они предоставляют мощные инструменты для работы с компонентами, composables, роутингом и состоянием. Однако даже опытные разработчики часто тратят время на написание шаблонного кода. В этой статье мы собрали 10 готовых промтов (промптов), которые помогут вам ускорить разработку и избежать типичных ошибок. Каждый промт — это конкретная инструкция для AI-ассистента, которую можно скопировать и сразу использовать в проекте.

Почему это важно? Согласно опросу State of JS 2025, Vue.js остаётся в топе по удовлетворённости разработчиков, а Nuxt 3, выпущенный в 2022 году и активно развивающийся, используется в 35% новых проектов на Vue (источник: официальная статистика Nuxt). Умение быстро генерировать качественный код с помощью промтов — это навык, который экономит часы работы. В этой подборке вы найдёте промты для компонентов, composables, роутинга, Pinia store и других ключевых элементов Vue/Nuxt.

1. Промт для создания компонента с TypeScript и props

Для чего: Быстро создать типизированный Vue-компонент с props, emits и слотами. Идеально для старта нового компонента.

Промт:

Создай Vue 3 компонент на Composition API с TypeScript. Компонент должен называться UserCard. Пропсы: name (string, required), age (number, optional), avatarUrl (string, optional с default). Emits: 'click' и 'update:name'. Добавь слот по умолчанию для дополнительного контента. Используй defineProps и defineEmits.

Пример использования: Скопируйте промт в AI-ассистент (например, ChatGPT, Claude или GitHub Copilot). Через несколько секунд вы получите готовый код:

<template>
  <div class="user-card" @click="emit('click')">
    <img v-if="avatarUrl" :src="avatarUrl" alt="avatar" />
    <h3>{{ name }}</h3>
    <p v-if="age">{{ age }} years old</p>
    <slot />
  </div>
</template>

<script setup lang="ts">
interface Props {
  name: string;
  age?: number;
  avatarUrl?: string;
}

const props = withDefaults(defineProps<Props>(), {
  avatarUrl: '/default-avatar.png'
});

const emit = defineEmits<{
  (e: 'click'): void;
  (e: 'update:name', value: string): void;
}>();
</script>

2. Промт для composable с асинхронной загрузкой данных

Для чего: Создать composable для получения данных с API, с обработкой состояний загрузки и ошибок. Экономит время на написание стандартной логики.

Промт:

Напиши composable для Vue 3 useFetchData, который принимает URL (string) и опциональные параметры запроса (object). Возвращает ref: data, error, isLoading. Используй fetch API и onMounted для вызова при монтировании. Добавь возможность повторного запроса через метод refresh.

Пример использования: После генерации вы получите готовый composable, который можно импортировать в любой компонент. Например:

import { ref, onMounted, type Ref } from 'vue';

interface UseFetchDataReturn<T> {
  data: Ref<T | null>;
  error: Ref<string | null>;
  isLoading: Ref<boolean>;
  refresh: () => Promise<void>;
}

export function useFetchData<T = unknown>(url: string, params?: Record<string, string>): UseFetchDataReturn<T> {
const data = ref<T

| null>(null) as Ref<T | null>;
  const error = ref<string | null>(null);
  const isLoading = ref(false);

  const fetchData = async () => {
    isLoading.value = true;
    error.value = null;
    try {
      const queryString = params ? '?' + new URLSearchParams(params).toString() : '';
      const response = await fetch(url + queryString);
      if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
      data.value = await response.json();
    } catch (err) {
      error.value = err instanceof Error ? err.message : 'Unknown error';
    } finally {
      isLoading.value = false;
    }
  };

  onMounted(fetchData);

  return { data, error, isLoading, refresh: fetchData };
}

3. Промт для динамического роутинга в Nuxt 3

Для чего: Настроить динамические маршруты в Nuxt 3 с параметрами и middleware. Подходит для страниц товаров, профилей пользователей и других динамических страниц.

Промт:

Создай страницу Nuxt 3 для динамического роутинга с параметром id в папке pages/users/[id].vue. Добавь middleware для проверки авторизации (useAuth). Используй useRoute для получения id и useFetch для загрузки данных пользователя. Обработай случаи, когда пользователь не найден (404).

Пример использования: После выполнения промта вы получите готовый файл pages/users/[id].vue:

<template>
  <div>
    <div v-if="loading">Загрузка...</div>
    <div v-else-if="error">Ошибка: {{ error }}</div>
    <div v-else-if="!user">Пользователь не найден</div>
    <div v-else>
      <h1>{{ user.name }}</h1>
      <p>Email: {{ user.email }}</p>
    </div>
  </div>
</template>

<script setup lang="ts">
definePageMeta({
  middleware: 'auth'
});

const route = useRoute();
const { data: user, error, pending: loading } = await useFetch(`/api/users/${route.params.id}`);
</script>

4. Промт для Pinia store с actions и getters

Для чего: Создать типизированный Pinia store с actions, getters и поддержкой TypeScript. Основа для управления состоянием в больших приложениях.

Промт:

Создай Pinia store для корзины покупок (cartStore) с использованием Options API. State: items (массив объектов с id, name, price, quantity). Getters: totalPrice, itemCount. Actions: addItem, removeItem, clearCart. Все данные должны быть типизированы с помощью TypeScript интерфейсов.

Пример использования: Промт генерирует готовый store, который можно подключить в компоненте:

import { defineStore } from 'pinia';

interface CartItem {
  id: number;
  name: string;
  price: number;
  quantity: number;
}

interface CartState {
  items: CartItem[];
}

export const useCartStore = defineStore('cart', {
  state: (): CartState => ({
    items: []
  }),
  getters: {
    totalPrice: (state) => state.items.reduce((sum, item) => sum + item.price * item.quantity, 0),
    itemCount: (state) => state.items.reduce((count, item) => count + item.quantity, 0)
  },
  actions: {
    addItem(item: CartItem) {
      const existing = this.items.find(i => i.id === item.id);
      if (existing) {
        existing.quantity += item.quantity;
      } else {
        this.items.push({ ...item });
      }
    },
    removeItem(id: number) {
      this.items = this.items.filter(i => i.id !== id);
    },
    clearCart() {
      this.items = [];
    }
  }
});

5. Промт для кастомной директивы v-focus

Для чего: Создать кастомную директиву для автоматического фокуса на элементе. Полезна для форм и модальных окон.

Промт:

Напиши кастомную директиву Vue 3 v-focus, которая устанавливает фокус на элементе при монтировании. Директива должна быть зарегистрирована глобально в main.ts. Добавь возможность модификатора .delay для задержки фокуса (например, v-focus.delay="500").

Пример использования: После создания директивы вы сможете использовать её в любом компоненте: <input v-focus.delay="200" />.

6. Промт для composable useDebounce

Для чего: Создать composable для дебаунса функций. Необходим для оптимизации поиска, фильтрации и других частых вызовов.

Промт:

Создай composable useDebounce, который принимает функцию и задержку (ms). Возвращает debounced версию функции. Используй setTimeout и clearTimeout. Добавь опцию immediate для немедленного вызова.

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

import { ref } from 'vue';

export function useDebounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number, immediate = false) {
  let timer: ReturnType<typeof setTimeout> | null = null;

  const debounced = (...args: Parameters<T>) => {
    if (timer) clearTimeout(timer);
    if (immediate && !timer) {
      fn(...args);
    }
    timer = setTimeout(() => {
      fn(...args);
      timer = null;
    }, delay);
  };

  return { debounced };
}

7. Промт для middleware в Nuxt 3

Для чего: Создать middleware для проверки аутентификации. Базовый элемент защиты маршрутов в Nuxt.

Промт:

Создай middleware для Nuxt 3 под названием auth. Он должен проверять, есть ли токен в localStorage. Если токена нет, перенаправлять на страницу /login. Используй navigateTo. Добавь проверку на стороне сервера (если процесс серверный, проверять cookie).

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

// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  if (process.client) {
    const token = localStorage.getItem('auth_token');
    if (!token) {
      return navigateTo('/login');
    }
  } else {
    // Для SSR можно проверить cookie
    const token = useCookie('auth_token').value;
    if (!token) {
      return navigateTo('/login');
    }
  }
});

8. Промт для компонента модального окна с Teleport

Для чего: Создать переиспользуемый компонент модального окна с использованием Teleport для корректного позиционирования.

Промт:

Создай Vue 3 компонент Modal с использованием Teleport. Компонент должен принимать пропсы: show (boolean), title (string). Добавь слот для контента. Закрытие по клику на оверлей и по нажатию Escape. Используй watch для синхронизации с show.

Пример использования: Полученный компонент можно использовать так:

<template>
  <Teleport to="body">
    <div v-if="show" class="modal-overlay" @click.self="close">
      <div class="modal-content">
        <h2>{{ title }}</h2>
        <slot />
        <button @click="close">Закрыть</button>
      </div>
    </div>
  </Teleport>
</template>

<script setup lang="ts">
const props = defineProps<{ show: boolean; title: string }>();
const emit = defineEmits<{ (e: 'update:show', value: boolean): void }>();

const close = () => emit('update:show', false);

const handleEscape = (e: KeyboardEvent) => {
  if (e.key === 'Escape') close();
};

onMounted(() => document.addEventListener('keydown', handleEscape));
onUnmounted(() => document.removeEventListener('keydown', handleEscape));
</script>

9. Промт для composable useLocalStorage

Для чего: Создать реактивную обёртку над localStorage с автоматической синхронизацией. Полезна для сохранения настроек пользователя.

Промт:

Напиши composable useLocalStorage, который принимает ключ (string) и значение по умолчанию. Возвращает ref, который автоматически синхронизируется с localStorage при изменении. Используй watch для отслеживания изменений. Обработай ошибки парсинга JSON.

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

import { ref, watch, type Ref } from 'vue';

export function useLocalStorage<T>(key: string, defaultValue: T): Ref<T> {
  const stored = localStorage.getItem(key);
  const data = ref<T>(stored ? JSON.parse(stored) : defaultValue) as Ref<T>;

  watch(data, (newVal) => {
    try {
      localStorage.setItem(key, JSON.stringify(newVal));
    } catch (e) {
      console.error('Failed to save to localStorage', e);
    }
  }, { deep: true });

  return data;
}

10. Промт для создания плагина в Nuxt 3

Для чего: Создать плагин для глобальной регистрации компонентов или подключения внешних библиотек.

Промт:

Создай плагин Nuxt 3 под названием 'icons', который глобально регистрирует компонент Icon из библиотеки heroicons. Используй defineNuxtPlugin. Плагин должен работать только на клиенте. Добавь поддержку TypeScript путём расширения глобальных типов.

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

// plugins/icons.client.ts
import { defineNuxtPlugin } from '#app';
import Icon from 'heroicons-vue';

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.vueApp.component('Icon', Icon);
});

// Для TypeScript: declare module 'vue' { export interface GlobalComponents { Icon: typeof import('heroicons-vue').default } }

Заключение

Эти 10 промтов покрывают большинство повседневных задач при разработке на Vue.js и Nuxt. Используйте их как отправную точку — адаптируйте под свои проекты, добавляйте типизацию и обработку ошибок. Главное преимущество промтов — скорость: вместо 15 минут на написание шаблонного кода вы тратите 2 минуты на генерацию и доработку.

Помните, что AI — это инструмент, а не замена опыту. Всегда проверяйте сгенерированный код на соответствие вашему стеку и требованиям безопасности. Если вы работаете с большими проектами, рекомендую протестировать промты на небольших задачах, чтобы оценить качество генерации.

Для дальнейшего изучения рекомендую официальную документацию Vue.js (vuejs.org) и Nuxt (nuxt.com), а также гайды по Composition API. Успешной разработки!

← Все статьи

Комментарии

Читайте также

Как подключить LiDAR (RPLIDAR, TFmini) к AI-агенту ASI Biont: картографирование и робототехника без кода

15 июля 2026

Компьютеры из «Парка Юрского периода» в мельчайших деталях: как Vibe Coding возрождает дух 90-х

15 июля 2026

Как LilyGO T-Beam и ASI Biont автоматизировали мониторинг автопарка: пошаговый гайд по интеграции GPS-трекера с AI-агентом

15 июля 2026

CISSP — Certified Information Systems Security Professional: как AI-тьютор превращает подготовку в персонализированное путешествие

15 июля 2026

STM32 (Blue Pill, Nucleo) + ASI Biont: AI-агент для промышленной автоматизации и прогнозной аналитики

15 июля 2026

Arduino Nano BLE Sense (TinyML) + ASI Biont: как подключить Edge AI к агенту и управлять жестами и звуками через чат

15 июля 2026

Мастерство контент-стратегии с помощью ИИ: глубокое погружение в курс «Контент-стратегия — контент-стратегия и контент-маркетинг» на Asibiont

15 июля 2026

Как я собрал OmniBot: Discord Activity, локальный ruBERT и модерация без чёрного ящика — разбор технического решения

15 июля 2026

Google Coral и ASI Biont: как запустить Edge AI с нулевой задержкой без облачных затрат

15 июля 2026