bootstrap-vue, element-ui, quasar, and vuetify are popular UI component libraries for Vue.js, but they differ significantly in Vue version support and scope. bootstrap-vue brings Bootstrap components to Vue 2, while element-ui offers an enterprise-style component set for Vue 2. quasar is a full-stack framework that supports Vue 3 and enables cross-platform development (Web, Mobile, Desktop). vuetify provides a comprehensive Material Design implementation with strong Vue 3 support in its latest version. Choosing between them depends heavily on whether you are building on Vue 2 or Vue 3, and whether you need a full application framework or just a UI kit.
When selecting a UI library for Vue.js, the decision impacts not just how your buttons look, but also your build process, Vue version compatibility, and long-term maintenance. bootstrap-vue, element-ui, quasar, and vuetify are four major players, but they serve different architectural needs. Let's break down how they compare in real-world engineering scenarios.
Before looking at components, you must check Vue version support. This is the most important architectural constraint.
bootstrap-vue is built for Vue 2.
// bootstrap-vue: Vue 2 only
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue)
element-ui is built for Vue 2.
element-plus.// element-ui: Vue 2 only
import ElementUI from 'element-ui'
Vue.use(ElementUI)
quasar supports Vue 3 (via Quasar v2).
// quasar: Vue 3 supported
import { createApp } from 'vue'
import { Quasar } from 'quasar'
createApp(App).use(Quasar)
vuetify supports Vue 3 (via Vuetify 3).
// vuetify: Vue 3 supported
import { createVuetify } from 'vuetify'
const vuetify = createVuetify()
createApp(App).use(vuetify)
💡 Warning: Do not start new projects with
bootstrap-vueorelement-uiunless you are locked into Vue 2. For Vue 3, choosequasarorvuetify.
How you import and use components varies from global registration to tree-shakable imports.
bootstrap-vue uses global registration or individual imports.
b- prefix.// bootstrap-vue: Button usage
import { BButton } from 'bootstrap-vue'
export default { components: { BButton } }
// Template: <b-btn variant="primary">Click</b-btn>
element-ui registers components globally by default.
el- prefix.// element-ui: Button usage
import { Button } from 'element-ui'
export default { components: { ElButton: Button } }
// Template: <el-button type="primary">Click</el-button>
quasar allows auto-importing via build config.
q- prefix.quasar.config.js to include them.// quasar: Button usage
// quasar.config.js: framework: { components: ['QBtn'] }
// Template: <q-btn color="primary" label="Click" />
vuetify uses tree-shakable imports in Vue 3.
v- prefix.// vuetify: Button usage
import { VBtn } from 'vuetify/components'
export default { components: { VBtn } }
// Template: <v-btn color="primary">Click</v-btn>
Layout handling differs from custom grid components to reliance on utility classes.
bootstrap-vue provides dedicated grid components.
<b-container>, <b-row>, <b-col>.// bootstrap-vue: Grid
<b-container>
<b-row>
<b-col md="6">Left</b-col>
<b-col md="6">Right</b-col>
</b-row>
</b-container>
element-ui has its own row/column components.
<el-row> and <el-col>.// element-ui: Grid
<el-row :gutter="20">
<el-col :span="12">Left</el-col>
<el-col :span="12">Right</el-col>
</el-row>
quasar relies heavily on Flexbox utilities.
<q-layout>, <q-page>, and CSS classes.// quasar: Grid
<div class="row q-col-gutter-md">
<div class="col-6">Left</div>
<div class="col-6">Right</div>
</div>
vuetify provides robust grid components.
<v-container>, <v-row>, <v-col>.// vuetify: Grid
<v-container>
<v-row>
<v-col cols="6">Left</v-col>
<v-col cols="6">Right</v-col>
</v-row>
</v-container>
Changing colors and styles ranges from simple variables to complex SASS configuration.
bootstrap-vue uses Bootstrap SASS variables.
// bootstrap-vue: Theming
$primary: #563d7c;
@import '~bootstrap/scss/bootstrap';
element-ui requires a theme generator or SASS overrides.
// element-ui: Theming
@import "~element-ui/packages/theme-chalk/src/index";
// Requires custom SASS configuration to override colors
quasar uses SASS variables and build config.
quasar.variables.scss.// quasar: Theming
// quasar.variables.scss
$primary: #563d7c;
$secondary: #26A69A;
vuetify uses a configuration object for themes.
// vuetify: Theming
createVuetify({
theme: {
themes: {
light: { colors: { primary: '#563d7c' } }
}
}
})
Some libraries are just UI kits, while others are full application frameworks.
bootstrap-vue is a UI kit only.
// bootstrap-vue: Standard Vue Router setup
import VueRouter from 'vue-router'
Vue.use(VueRouter)
element-ui is a UI kit only.
// element-ui: Standard Vue Router setup
import VueRouter from 'vue-router'
Vue.use(VueRouter)
quasar is a full framework.
// quasar: Built-in Router via config
// quasar.config.js handles routing automatically
// src/router/routes.js defines your paths
vuetify is a UI kit only.
// vuetify: Vite plugin setup
import { defineConfig } from 'vite'
import vuetify from 'vite-plugin-vuetify'
export default defineConfig({ plugins: [vuetify()] })
While they differ in scope, all four libraries share common goals.
// All libraries offer a Button component
// bootstrap-vue: <b-btn>
// element-ui: <el-button>
// quasar: <q-btn>
// vuetify: <v-btn>
// All support responsive breakpoints
// bootstrap-vue: <b-col md="6">
// element-ui: <el-col :span="12">
// quasar: class="col-md-6"
// vuetify: <v-col cols="12" md="6">
// All support locale settings
// bootstrap-vue: import { BTable } from 'bootstrap-vue'; set locale
// element-ui: Vue.locale('en', {...})
// quasar: lang.set('en-US')
// vuetify: createVuetify({ locale: { locale: 'en' } })
| Feature | bootstrap-vue | element-ui | quasar | vuetify |
|---|---|---|---|---|
| Vue Version | ❌ Vue 2 Only | ❌ Vue 2 Only | ✅ Vue 3 Supported | ✅ Vue 3 Supported |
| Scope | UI Kit | UI Kit | Full Framework | UI Kit |
| Design Style | Bootstrap | Enterprise | Material + Custom | Material Design |
| Mobile Apps | ❌ No | ❌ No | ✅ Yes (Capacitor/Cordova) | ❌ No |
| Theming | SASS Variables | SASS Overrides | SASS + Config | JS Config Object |
bootstrap-vue and element-ui are legacy choices for Vue 2.
quasar is a powerhouse for cross-platform development.
vuetify is the standard for Material Design on Vue 3.
Final Thought: For new projects in 2024 and beyond, prioritize Vue 3 compatibility. This eliminates bootstrap-vue and element-ui from consideration unless you have specific legacy constraints. Between quasar and vuetify, choose quasar for multi-platform apps and vuetify for web-focused Material Design interfaces.
Choose vuetify if you prefer Material Design and want a rich set of polished components without adopting a full application framework. It works well with standard Vue CLI or Vite setups and is a strong choice for Vue 3 projects focused on web interfaces.
Choose quasar if you need a complete solution that handles UI components, routing, state management, and build tooling for web, mobile, and desktop from a single codebase. It is ideal for teams wanting to maximize code reuse across platforms with strong Vue 3 support.
Choose bootstrap-vue only if you are maintaining an existing Vue 2 project that already relies on Bootstrap styling. It is not recommended for new projects because it does not support Vue 3. For Vue 3 projects needing Bootstrap styles, evaluate bootstrap-vue-next or alternative libraries instead.
Choose element-ui only for legacy Vue 2 admin dashboards where consistency with existing systems is required. It is not suitable for new development as it lacks Vue 3 support. For modern projects requiring similar components, switch to element-plus, which is the official Vue 3 successor.
To check out the documentation, visit vuetifyjs.com.
Getting started with Vuetify is easy. To create a new project, choose your package manager and run one of the following commands:
Using pnpm
pnpm create vuetify
Using yarn
yarn create vuetify
Using npm
npm create vuetify@latest
Using bun
bun create vuetify
For more information on how to get started, such as using Nuxt or Laravel, check out the official Installation guide.
Vuetify is a MIT licensed project that is developed and maintained by the Core Team. Sponsor Vuetify and receive some awesome perks and support Open Source Software at the same time! 🎉
Funds donated through GitHub Sponsors directly support John Leider and the ongoing development and maintenance of Vuetify. Funds donated via Open Collective are managed with transparent expenses and will be used for compensating work and expenses for Core team members. Your name/logo will receive proper recognition and exposure by donating on either platform.
|
|
|
|
|
|
|
Vuetify is a no design skills required UI Library with beautifully handcrafted Vue Components. No design skills required — everything you need to create amazing applications is at your fingertips. Vuetify has a massive API that supports any use-case. Some highlights include:
Vuetify supports all modern browsers, including Safari 13+ (using polyfills). Components are designed for a minimum width of 320px.
| Name | Description |
|---|---|
| 🕶️ Vuetify Awesome | Awesome stuff built with Vuetify. |
| 🗑️ Vuetify Bin | A pastebin for saving code snippets. |
| 🫧 Vuetify Create | Scaffolding tools for creating new Vuetify projects. |
| 💭 Vuetify Discord | Our massive and inclusive Discord server where you can ask questions, share feedback, and connect with other Vuetify developers. |
| 🧹 Vuetify ESLint | An opinionated [ESLint config](https://github.com/vuetifyjs/eslint-config-vuetify) for styling and an [ESLint plugin](https://github.com/vuetifyjs/eslint-plugin-vuetify) for upgrading Vuetify version. |
| 🐛 Vuetify Issues | A web application for reporting bugs and issues with Vuetify, Documentation, or one of our other packages. |
| 📦 Vuetify Loader | A monorepo of compiler plugins for autoloading Vuetify components and configuring styles. |
| 🧠 Vuetify MCP | A Model Context Protocol server for developing with Vuetify and Agents. |
| 🎮 Vuetify Playground | A Vuetify 3 playground built using vuejs/repl where you can play with our components. |
| ✂️ Vuetify Snips | Pre-built code snippets for Vuetify components that you can use in your projects |
| 🛒 Vuetify Store | The official Vuetify Store where you can download free digital products, purchase pre-made themes, and more. |
For help and support questions, please use our Discord community. This issue list of this repo is exclusively for bug reports and feature requests.
Use our Issue generator to report bugs and request new features.
Please make sure to read the Important Information before opening an issue. Issues not confirming to the guidelines may be closed immediately.
2️⃣ Vuetify 2 Support Vuetify 2 is now End Of Life (EOL) and is no longer supported, even for security issues. Commercial support for this version is available from our partner, HeroDevs.
Detailed changes for each release are documented in the release notes.
Developers interested in contributing should read the Code of Conduct and the Contribution Guide.
Please do not ask general questions in an issue. Issues are only to report bugs, suggest enhancements, or request new features. For general questions and discussions, ask in the community chat.
To help you get you familiar with our contribution process, we have a list of good first issues that contain bugs which have a relatively limited scope. This is a great place to get started. If you have any questions, please join us on the community chat.
We also have a list of help wanted issues that you might want to check.
Vuetify is available under the MIT software license.
Copyright (c) 2016-present Vuetify, LLC
This project exists thanks to all the people who contribute 😍!