- Los nombres de archivos siempre deben ser en lowercase y kebab case.
appTable.vue
StaticMap.vue
app-table.vue
static-map.vue
- Los nombres de los componentes deben ser igual al nombre del archivo (ver regla #1)
export default {
name: 'AppTable',
};
export default {
name: 'app-table',
};
- La propiedad name debe estar primera en la definición del componente. SIEMPRE.
export default {
methods,
watch,
data
computed,
name: 'app-table',
};
export default {
name: 'app-table',
data,
watch,
};
- Todas las funciones que un componente necesita se deben declarar fuera de la definición del mismo.
export default {
name: 'app-table',
data() {},
methods: {
myMethod() {},
},
computed: {
myComputed() {},
},
watch: {
name: () => {},
},
};
function data() {}
function myComputed() {}
function myMethod() {}
function name() {}
export default {
name: 'app-table',
data,
methods: {
myMethod,
},
computed: {
myComputed,
},
watch: {
name,
},
};
- Usar la sintaxis corta @ or : sobre v-bind y v-on
<input v-on:change="onChange" />
<button v-bind:disabled="isDisabled">Submit</button>
<input @change="onChange" />
<button :disabled="isDisabled">Submit</button>
- La sección de style de los componentes siempre debe usar el atributo scoped. La única excepción es el componente base App.
<template>
<button class="button">Submit</button>
</template>
<style>
.button {
border: none;
border-radius: 2px;
}
</style>
<template>
<button class="button">Submit</button>
</template>
<style scoped>
.button {
border: none;
border-radius: 2px;
}
</style>
- Usar $ como prefijo para variables dentro de la instancia de Vue.
import Vue from 'vue';
Vue.userInfo = { id: 1, name: 'Cosme Fulanito' };
import Vue from 'vue';
Vue.$userInfo = { id: 1, name: 'Cosme Fulanito' };
- Nunca poner logica en los templates, usar methods/computed.
<template>
<div v-if="someArray.length > 0">
</div>
</template>
<template>
<div v-if="hasValues">
</div>
</template>
<script>
function hasValues() {
return this.someArray.length > 0;
}
</script>
- Siempre usar v-key junto a la directiva v-for
<ul v-for="item in items">
<ul v-for="item in items" :key="item">
- Evitar el uso de v-if al mismo nivel de v-for
<ul v-for="user in users" v-if="user.active" :key="user.id">
</ul>
<ul v-for="user in filteredUsers" :key="user.id">
</ul>
<script>
function filteredUsers() {
return this.users.filter(u => u.active);
}
export default {
name: 'user-list',
computed: {
filteredUsers,
},
};
</script>
- Usar filtros siempre que se quiera presentar datos en una manera distinta sin afectar al valor original.
<td>
{{ amount }}
</td>
<script>
function created() {
this.amount = this.amount.toFixed(2);
}
export default {
created,
}
</script>
<td>
{{ amount | round }}
</td>
<script>
function round(value) {
return value.toFixed(2);
}
export default {
filters: {
round,
},
};
</script>
- Siempre usar clases de css sobre otro tipo de selectores.
<template>
<button>Submit</button>
</template>
<style scoped>
button {
background-color: peru;
padding: 20px;
}
</style>
<template>
<button class="btn">Submit</button>
</template>
<style scoped>
.btn {
background-color: peru;
padding: 20px;
}
</style>
- Los componentes deben siempre tener las secciones template, script y style en ese orden.
<script>
</script>
<style>
</style>
<template>
</template>
<template>
</template>
<script>
</script>
<style lang="scss" scoped>
</style>