CDN (Quick Start)
<script src="https://unpkg.com/vue@3"></script>
<div id="app">{{ message }}</div>
<script>
Vue.createApp({
data() {
return { message: "Hello Vue!" };
},
}).mount("#app");
</script>A Vue 3 cheat sheet with the most important concepts, reactivity, component system, routing, and more. Updated for the latest version and perfect for both beginners and advanced users.
The ultimate reference for mastering Vue 3.
<script src="https://unpkg.com/vue@3"></script>
<div id="app">{{ message }}</div>
<script>
Vue.createApp({
data() {
return { message: "Hello Vue!" };
},
}).mount("#app");
</script>npm create vite@latest my-vue-app --template vue
cd my-vue-app
npm install
npm run devsrc/
├─ components/
├─ views/
├─ App.vue
├─ main.jsdata() {
return {
count: 0,
message: "Welcome!"
};
},
methods: {
increment() {
this.count++;
}
}<h1>{{ message }}</h1>
<button @click="increment">+</button>| Directive | Purpose |
|---|---|
v-bind / : | Bind attributes |
v-model | Two-way binding |
v-if / v-else | Conditional rendering |
v-show | Toggle visibility |
v-for | List rendering |
v-on / @ | Event handling |
v-slot | Named/Scoped slot usage |
<input v-model="name" />
<p v-if="name">Hi, {{ name }}!</p>
<ul>
<li v-for="item in list" :key="item.id">{{ item }}</li>
</ul>created() {},
mounted() {},
updated() {},
unmounted() {}<button @click="sayHi">Click</button> <input @keyup.enter="submit" />computed: {
reversed() {
return this.message.split('').reverse().join('');
}
},
watch: {
count(newVal, oldVal) {
console.log(`Count changed from ${oldVal} to ${newVal}`);
}
}app.component("Greeting", {
props: ["name"],
template: `<h1>Hello, {{ name }}!</h1>`,
});<Greeting name="Sumangal" />props: {
title: String,
age: {
type: Number,
default: 18
}
}this.$emit("custom-event", payload);props: ['modelValue'],
emits: ['update:modelValue']<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />import { ref, computed } from "vue";
export default {
setup() {
const count = ref(0);
const double = computed(() => count.value * 2);
const increment = () => count.value++;
return { count, double, increment };
},
};npm install vue-routerimport { createRouter, createWebHistory } from "vue-router";
import Home from "./views/Home.vue";
import About from "./views/About.vue";
const routes = [
{ path: "/", component: Home },
{ path: "/about", component: About },
];
export default createRouter({
history: createWebHistory(),
routes,
});import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
const app = createApp(App);
app.use(router).mount("#app");npm install piniaimport { defineStore } from "pinia";
export const useCounterStore = defineStore("counter", {
state: () => ({ count: 0 }),
actions: {
increment() {
this.count++;
},
},
});const counter = useCounterStore();
counter.increment();<!-- Default -->
<slot></slot>
<!-- Named -->
<slot name="header"></slot>
<!-- Scoped -->
<slot :user="user"></slot>npm install vitest @vue/test-utilsimport { mount } from "@vue/test-utils";
import MyComponent from "@/components/MyComponent.vue";
test("renders", () => {
const wrapper = mount(MyComponent);
expect(wrapper.text()).toContain("Hello");
});Use ref() for primitives, reactive() for objects
Use <script setup> syntax in SFCs
Break UI into small, reusable components
Always define key in v-for
Use slots for flexible composition
Adapted from Fechin/referenceGPL-3.0 licenseMarkdown sourceChanges and attribution