логотип PurpleSchool
логотип PurpleSchool

Использование Quasar Framework для разработки на Vue с готовыми UI-компонентами

Автор

Олег Марков

Введение

Если вы разрабатываете современные веб-приложения на Vue, то наверняка сталкивались с необходимостью быстро создавать удобные интерфейсы без больших затрат времени на стилизацию и верстку. Именно для этих задач создан Quasar Framework — это полноценная экосистема для Vue, предоставляющая готовые UI-компоненты, мощные CLI-инструменты и подробную документацию для быстрой и продуктивной разработки.

Quasar ориентирован на разработчиков, которым нужны не только стандартные визуальные элементы, но и возможность вывода приложения под разные платформы: веб, мобильные устройства, десктоп. Фреймворк берёт на себя огромное количество рутинных задач, позволяя сфокусироваться на бизнес-логике. Здесь я покажу, как вы сможете использовать возможности Quasar, чтобы сделать процесс разработки максимально комфортным.

Понятие и основные возможности Quasar Framework

Что такое Quasar Framework

Quasar Framework — это open source фреймворк, построенный на базе Vue.js, дающий доступ к обширной коллекции гибко настраиваемых UI-компонентов. Главная особенность — возможность писать единый код и деплоить его сразу в веб, в мобильные приложения (через Cordova или Capacitor), а также в виде desktop-приложений (через Electron).

Ключевые особенности Quasar:

  • Более 70 готовых UI-компонентов: от кнопок и таблиц до полноценных layout-решений.
  • Продвинутый CLI, помогающий быстро развернуть, собрать и протестировать проект.
  • Встроенные утилиты для адаптивности, кастомизации тем, работы с иконками и анимациями.
  • Возможность создавать PWA, SPA, SSR, мобильные и desktop приложения из одной codebase.

Давайте рассмотрим, как начать работу с Quasar и использовать его возможности для разработки интерфейсов.

Установка Quasar Framework

Для начала вам потребуется установленный Node.js и npm (или Yarn). Самый быстрый способ старта — использовать официальный CLI Quasar. Вот как это делается:

npm install -g @quasar/cli
# или с помощью yarn:
# yarn global add @quasar/cli

После установки CLI создайте новый проект:

quasar create my-quasar-app

CLI задаст вам ряд вопросов о типе проекта, поддержке TypeScript, настройках линтеров и т. д. После создания переходите в директорию и запускайте dev server:

cd my-quasar-app
quasar dev

Это позволит вам сразу увидеть приложение в браузере. Как видите, старт работы очень простой.

Структура проекта Quasar

Quasar scaffold создает папку с готовой структурой:

  • src/ — исходники приложения
  • src/components/ — пользовательские компоненты
  • src/pages/ — страницы приложения
  • src/layouts/ — шаблоны (layouts) для страниц
  • quasar.conf.js — основной файл конфигурации проекта

Смотрите, куда стоит добавлять основные элементы вашего интерфейса:

  • UI-компоненты Quasar используются внутри src/pages или src/components.
  • Layout компоненты (например, с навигацией, хедером) размещаются в src/layouts.
  • Тема, плагины и глобальные настройки указываются в quasar.conf.js.

Использование готовых UI-компонентов

Quasar поставляется с огромным набором UI-компонентов — кнопки (QBtn), формы (QInput, QSelect), таблицы (QTable), карточки (QCard), уведомления, модальные окна и ещё много других.

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

Допустим, вы хотите создать страницу с кнопкой и полем ввода. Давайте посмотрим, как это делается:

<template>
  <q-page padding>
    <q-input v-model="name" label="Введите ваше имя" />
    <q-btn label="Отправить" color="primary" @click="submit" />
  </q-page>
</template>

<script setup>
import { ref } from 'vue'

const name = ref('')

function submit() {
  // Здесь вы обрабатываете данные формы
  alert(`Имя - ${name.value}`)
}
</script>

Здесь используются компоненты Quasar: QInput (поле ввода), QBtn (кнопка), QPage (контейнер страницы). Такой подход позволяет очень быстро собирать рабочий UI.

Кастомизация компонентов

Почти каждый компонент в Quasar поддерживает множество props для изменений внешнего вида и поведения. Смотрите пример:

<q-btn
  label="Добавить"
  color="secondary"
  icon="add"
  size="lg"
  rounded
  unelevated
  @click="addItem"
/>

// Кнопка с иконкой, большим размером, скруглёнными углами и без тени

Использование layout и слотов

Для построения сложных страниц удобно использовать layout-компоненты. Например:

<template>
  <q-layout view="lHh Lpr lFf">
    <q-header>
      <q-toolbar>
        <q-toolbar-title>
          Пример Quasar Layout
        </q-toolbar-title>
      </q-toolbar>
    </q-header>

    <q-page-container>
      <router-view />
    </q-page-container>
  </q-layout>
</template>

// Этот пример показывает, как организовать хедер, тулбар и страницу с помощью QLayout и QHeader

Работа с темами и кастомизацией стилей

Quasar позволяет кастомизировать внешний вид через сконфигурированные SCSS или через props компонентов. Вы также можете выбрать светлую или тёмную тему для всего приложения или отдельных компонентов.

Пример переключения темы

<template>
  <q-toggle v-model="isDark" label="Тёмная тема" />
  <div :class="{ 'bg-grey-2': !isDark, 'bg-grey-10 text-white': isDark }">
    Ваш контент здесь
  </div>
</template>

<script setup>
import { ref, watch } from 'vue'
import { Dark } from 'quasar'

const isDark = ref(Dark.isActive)

watch(isDark, (val) => {
  Dark.set(val)
})
</script>

// С этим кодом можно реализовать переключение между светлой и тёмной темой на лету

Интеграция с иконками и анимациями

Quasar поддерживает несколько икон-паков (Material Icons, Font Awesome и др.). Чтобы использовать, например, Material Icons:

  1. Включите их в конфиге quasar.conf.js (раздел framework.icons).
  2. Используйте как свойство icon в любом компоненте.
<q-btn icon="star" label="Like" color="warning" />

Для анимаций доступна утилита Quasar Animate с десятками эффектов, например:

<q-btn
  label="Animated"
  class="animate__animated animate__bounce"
  color="primary"
/>

// Класс добавляет анимацию кнопке через animate.css, интегрированной в Quasar

Работа с формами, валидацией и управлением состоянием

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

<template>
  <q-form @submit="onSubmit" class="q-gutter-md">
    <q-input
      v-model="email"
      label="Email"
      type="email"
      :rules="[val => !!val || 'Введите email', val => /.+@.+\..+/.test(val) || 'Некорректный email']"
      lazy-rules
    />
    <q-btn type="submit" label="Отправить" color="primary" />
  </q-form>
</template>

<script setup>
import { ref } from 'vue'

const email = ref('')

function onSubmit() {
  // Обработка формы
  alert(`Email: ${email.value}`)
}
</script>

// QForm поддерживает валидацию через rules, что сильно упрощает контроль над данными

Таблицы, списки и пагинация

Quasar QTable — один из самых мощных компонентов для работы с таблицами. Пример:

<template>
  <q-table
    :rows="rows"
    :columns="columns"
    row-key="name"
    :pagination="pagination"
  />
</template>

<script setup>
const columns = [
  { name: 'name', label: 'Имя', field: 'name' },
  { name: 'age', label: 'Возраст', field: 'age', sortable: true },
]
const rows = [
  { name: 'Иван', age: 22 },
  { name: 'Анна', age: 34 },
  { name: 'Петр', age: 49 },
]
const pagination = { rowsPerPage: 5 }
</script>

// QTable легко настраивается для сортировки, пагинации, фильтрации, кастомной рендеризации ячеек

Модальные окна, диалоги и уведомления

Для обратной связи с пользователем или подтверждения действий используйте QDialog и Notify:

<template>
  <q-btn label="Открыть диалог" @click="dialog = true" />
  <q-dialog v-model="dialog">
    <q-card>
      <q-card-section>
        Подтвердите своё действие
      </q-card-section>
      <q-card-actions align="right">
        <q-btn flat label="Отмена" v-close-popup />
        <q-btn flat label="ОК" color="primary" @click="confirm" />
      </q-card-actions>
    </q-card>
  </q-dialog>
</template>

<script setup>
import { ref } from 'vue'
const dialog = ref(false)
function confirm() {
  // Реакция на подтверждение
  dialog.value = false
}
</script>

// Пример показывает стандартный паттерн для окон подтверждения

Для быстрых уведомлений (pop-up) — используйте Notify:

import { Notify } from 'quasar'

Notify.create({
  message: 'Сохранено!',
  color: 'positive',
  position: 'top-right',
  timeout: 2000
})

// Notify позволяет быстро выводить сообщения пользователю

Локализация и межплатформенность

Quasar уже содержит встроенную поддержку локализации. Просто выберите нужный язык в конфиге приложения. Для сложных приложений используйте интеграцию с vue-i18n:

import { createI18n } from 'vue-i18n'
const i18n = createI18n({
  locale: 'ru',
  messages: {
    ru: { welcome: 'Добро пожаловать' },
    en: { welcome: 'Welcome' }
  }
})
// Примените i18n при создании приложения

// Поддержка мультиязычности — must-have для большинства production-проектов

Сборка и деплой на разные платформы

Quasar — не только UI-фреймворк, но и универсальный инструмент сборки. Вы можете за один клик собрать приложение как:

  • браузерное SPA / SSR / PWA (quasar build)
  • мобильное приложение (Android/iOS через Cordova или Capacitor) (quasar mode add capacitor; quasar dev -m capacitor)
  • desktop-приложение (Electron) (quasar mode add electron; quasar dev -m electron)

С CLI это делается очень быстро, и не требует ручной настройки webpack, babel, etc.

quasar build -m spa           # Сборка обычного веб-приложения
quasar build -m pwa           # Сборка PWA
quasar build -m electron      # Сборка desktop-приложения

Для мобильных платформ используйте Cordova или Capacitor:

quasar mode add capacitor
quasar dev -m capacitor -T android

// Теперь одно Vue-приложение разворачивается сразу под несколько платформ

Примеры сложных интерфейсов и лучшие практики

Если вам требуется сложный UI — например, многоуровневое меню, дашборды, фильтры и уведомления — Quasar сильно упрощает процесс. Вам стоит грамотно разделять логику между layout, page и вспомогательными компонентами, а также активно использовать слоты и scoped slots для кастомизации вывода.

Покажу пример реализации дашборда:

<template>
  <q-layout>
    <q-header elevated>
      <q-toolbar>
        <q-toolbar-title>Дашборд</q-toolbar-title>
      </q-toolbar>
    </q-header>
    <q-drawer v-model="drawer" show-if-above>
      <q-list>
        <q-item clickable v-for="item in menu" :key="item.label" @click="navigate(item)">
          <q-item-section>{{ item.label }}</q-item-section>
        </q-item>
      </q-list>
    </q-drawer>
    <q-page-container>
      <router-view />
    </q-page-container>
  </q-layout>
</template>

<script setup>
import { ref } from 'vue'
const drawer = ref(true)
const menu = [
  { label: 'Главная', route: '/' },
  { label: 'Отчет', route: '/report' }
]
function navigate(item) {
  // Ваша логика навигации
}
</script>

// Пример рабочего дашборда с меню и страницами

Использование слотов позволяет вставлять любой контент туда, где это нужно, а scoped slots дают доступ к динамическим данным из компонента.

Заключение

Quasar Framework представляет собой мощный и гибкий инструмент для быстрой и качественной разработки Vue-приложений, предлагая набор production-ready компонентов, систему роутирования, сборку под разные платформы и множество опций кастомизации. Все компоненты легко интегрируются между собой, что снижает количество кода и увеличивает продуктивность. Благодаря продуманной архитектуре, мощным CLI инструментам и углубленной документации, вы сможете реализовать практически любой UI и даже больше — без необходимости городить “велосипед” на голом CSS или из сторонних пакетов.

Частозадаваемые технические вопросы по теме статьи и ответы на них

Как добавить свой кастомный SCSS или CSS к стилям Quasar?

Создайте файл стилей (например, src/css/my-styles.scss) и подключите его в quasar.conf.js внутри массива css, например:
js css: [ 'app.scss', 'css/my-styles.scss' ] Теперь все ваши стили будут доступны приложению.

Как использовать сторонние Vue-плагины вместе с Quasar?

Добавьте нужный плагин через npm. После установки подключите его в файле src/boot/имя.js и добавьте этот файл в раздел boot в quasar.conf.js. В самом boot-файле делайте import и регистрацию плагина внутри setup.

Возникают ли конфликты между Quasar и Vuetify/Buefy?

Нежелательно использовать Quasar совместно с другими UI-фреймворками на одном проекте, потому что возможны конфликты стилей и зависимостей компонентов. Лучше придерживаться одного большого UI-фреймворка.

Как оптимизировать сборку Quasar для production?

В файле quasar.conf.js настройте minification, tree-shaking, выключите source-maps, используйте code splitting. Можно задать анализ бандла через опцию analyze: true в разделе build.

Как использовать Vuex или Pinia (состояние) внутри проекта Quasar?

Quasar полностью совместим с Vuex и Pinia. Просто установите нужный пакет, создайте store, и подключите его как обычно — через импорт и передачу в createApp в main.js. Доступ к store во всех компонентах обеспечен стандартным способом.

Стрелочка влевоОрганизация и структура исходных файлов в проектах VueОбзор популярных шаблонов и стартовых проектов на VueСтрелочка вправо

Все гайды по Vue

Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueРабота с таблицами во Vue через TanStackИнструкция по установке и компонентам Vue sliderУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsГайд по defineEmits на Vue 3Понимание core функционала Vue и его применениеПонимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueИнтеграция Vue с PHP для создания динамичных веб-приложенийКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueИнтеграция Vue.js с Django для создания полноценных веб-приложенийСоздание и работа с дистрибутивом build dist Vue приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
Управление переменными и реактивными свойствами во VueИспользование v for и slot в VueПрименение v-bind для динамической привязки атрибутов в VueУправление пользователями и их данными в Vue приложенияхСоздание и использование UI Kit для Vue приложенийТипизация и использование TypeScript в VuejsИспользование шаблонов в Vue js для построения интерфейсовИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreСоздание и использование компонентов в Vue JSОбработка кликов и пользовательских событий в VueИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueРабота с teleport для управления DOM во VueПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterКак использовать require в Vue для динамического импорта модулейРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиРуководство по nextTick для работы с DOMСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьИспользование Crystal с Vue для разработкиИспользование вычисляемых свойств для динамического отображения данных на Vue jsОптимизация производительности и предупреждения в Vue
Открыть базу знаний