2024-08-10
Vue cheatsheet
Vue is a JavaScript framework for building user interfaces.
Application
html
<div id="app">Hello {{ name }}!</div>
js
import { createApp } from 'vue';
const app = createApp({
    data() {
        return { name: 'Marcin' };
    },
});
app.mount('#app');
Template
Value binding
html
{{ name }}
Attributes binding
html
<button :disabled="isDisabled">Submit</button>
<div v-bind="attrs"></div>
html
<div :class="{ 'article--edited': isEdited }"></div>
Conditional rendering
html
<article v-if="loaded"></article>
html
<div v-if="loaded"></div>
<div v-else-if="error">Error</div>
<div v-else>Loading...</div>
Loops
html
<ul>
    <li v-for="item in items" :key="item.id">
        {{ item.value }}
    </li>
</ul>
html
<ul>
    <li v-for="(item, index) in items" :key="index">
        {{ index }} - {{ item.value }}
    </li>
</ul>
Events
html
<button
    type="button"
    @click="doSomething"
>Submit</button>
Form input
vue
<input type="text" v-model="value" />
vue
<textarea v-model="value"></textarea>
vue
<input type="checkbox" id="checkbox" v-model="checked" />
vue
<input type="radio" id="man" value="Man" v-model="gender" />
<label for="man">Man</label>
<input type="radio" id="woman" value="Woman" v-model="gender" />
<label for="woman">Woman</label>
html
<select v-model="language">
  <option disabled value="">Please select one</option>
  <option value="en">EN</option>
  <option value="pl">PL</option>
  <option value="de">DE</option>
</select>
Component
Reactivity
ts
const name = ref('Marcin');
console.log(name.value); // Marcin
ts
const state = reactive({ name: 'Marcin' });
console.log(state.name); // Marcin
ts
const age = ref(20);
const name = ref('Peter');
const label = computed(() => {
    if (age.value < 18) {
        return 'Not allowed';
    }
    
    return name.value;
});
console.log(label.value); // Peter
age.value = 12;
console.log(label.value); // Not allowed
Props
vue
<script setup lang="ts">
    const props = defineProps<{
        name: string,
        surname?: string,
    }>();
</script>
<template>
    {{ props.name }}
    {{ name }}
</template>
vue
<MyComponent name="Marcin" surname="Saja" />
Events
vue
<script setup lang="ts">
    const emit = defineEmits('submit');
</script>
<template>
    <button type="button" @click="emit('submit')">Submit</button>
</template>
vue
<MyComponent @submit="alert('Submitted')" />
v-model
vue
<script setup lang="ts">
const model = defineModel();
</script>
<template>
    <div>
        {{ model }}
    </div>
    <input type="text" v-model="model" />
</template>
vue
<MyComponent v-model="name" />
Watchers
ts
const name = ref();
watch(name, (newName) => console.log('change!'));
ts
const name = ref('Marcin');
const surname = ref('Saja');
watchEffect(() => {
    if (name.value.length > 0) {
        console.log('name has length greater than 0');
    }
    if (surname.value.length > 0) {
        console.log('surname has length greater than 0');
    }
})
Template refs
vue
<script setup lang="ts">
import { ref, onMounted } from 'vue';
const input = ref(null);
onMounted(() => {
  input.value.focus();
})
</script>
<template>
  <input ref="input" />
</template>
Slots
vue
<template>
  <div>
      This is the slot:
      <slot></slot>
  </div>
</template>
vue
<MyComponent>
    Content of the slot
</MyComponent>
Lifecycle
js
onMounted(() => console.log('Component mounted'));
onUpdated(() => console.log('Component updated'));
onUnmounted(() => console.log('Component unmounted'));
onBeforeMount(() => console.log('Component before mount'));
onBeforeUpdate(() => console.log('Component before updated'));
onBeforeUnmount(() => console.log('Component before unmount'));
onErrorCaptured(() => console.log('Error in the component'));
js
// SSR only
onServerPrefetch(() => console.log('Prefetched on server'));
js
// Only in <KeepAlive> component:
onActivated(() => console.log('Component activated'));
onDeactivated(() => console.log('Component deactivated'));
Dependency injection
vue
<script setup lang="ts">
// parent component:
import { provide } from 'vue';
provide('url', 'https://msaja.dev/api/');
</script>
vue
<script setup lang="ts">
// child component:
import { inject } from 'vue';
const url = inject('url');
</script>
Directives
vue
<script setup>
// enables v-focus in templates
const vFocus = {
  mounted: (el) => el.focus()
}
</script>
<template>
  <input v-focus />
</template>